Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.50/6: Рейтинг темы: голосов - 6, средняя оценка - 4.50
Denuha
9 / 9 / 7
Регистрация: 01.07.2015
Сообщений: 88
1

Объясните непрогнозируемый результат переполнение типа char

27.10.2016, 21:10. Просмотров 1108. Ответов 6
Метки нет (Все метки)

Есть тип char с диапазоном значений [0..255]
До 255 значения выводятся адекватно.
От 256 до 383 выводит положительные числа n-255. Почему?
Объясните работу 9-11 строки.
C++
1
2
3
4
5
6
7
8
9
10
11
char ch1=100; 
printf("ch1= %d\n", ch1); // Выводит 100
printf("ch1= %u\n", ch1); // Выводит 100
 
char ch2=350; 
printf("ch2= %d\n", ch2); // Выводит 94
printf("ch2= %u\n", ch2); // Выводит 94
 
char ch3=400;
printf("ch3= %d\n", ch3); // Выводит -112
printf("ch3= %u\n", ch3); // Выводит 4294967184
0
Лучшие ответы (1)
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
27.10.2016, 21:10
Ответы с готовыми решениями:

Объясните как правильно сравнить переменные типа char
Испульзую (strcmp(a.StNazn,c)==0) Не работает. Если поменять на (strcmp(a.StNazn,c)<0) ...

Условие типа if( масив типа char[x] [y] != переменная типа char) не срабатывает
Создал функцию ChangeWay(). Все, кроме if(map !=ar) (обе переменные типа char) работает...

Аргумент типа (const char*) несовместим с параметром типа (char*). Как исправить?
#include "Table.h" #include "Contour.h" #include "TwoShape.h" #include <iostream> int...

Как полю класса типа char* присвоить значение типа *char
Проблема в строчке 46 (не пинайте сильно за формат кода и за говнокод) #include "stdafx.h" ...

Аргумент типа char** не совместим с параметром типа const char*
Программа должна позволять заносить в структуру данные и выводить на экран информацию о поездах,...

6
Hikari
Хитрая блондиночка $)
1460 / 974 / 399
Регистрация: 21.12.2015
Сообщений: 3,785
27.10.2016, 21:17 2
Цитата Сообщение от Denuha Посмотреть сообщение
От 256 до 383 выводит положительные числа n-255. Почему?
Потому скорее всего, что на этапе присвоения числа, не умещающегося в тип переменной, компилятор (и может и при выполнении) присваиваются младшие разряды присваиваемого (в твоем случае младший байт двубайтного числа 400)
Насколько я помню.
0
Denuha
9 / 9 / 7
Регистрация: 01.07.2015
Сообщений: 88
27.10.2016, 21:26  [ТС] 3
Hikari, как работает 5-7 строка я понял. А можно поподробнее 9-11?
0
TheCalligrapher
С чаем беда...
Эксперт CЭксперт С++
5904 / 2882 / 786
Регистрация: 18.10.2014
Сообщений: 5,277
27.10.2016, 23:22 4
Цитата Сообщение от Denuha Посмотреть сообщение
Есть тип char с диапазоном значений [0..255]
Вы уверены, что у вас char обладает таким диапазоном? Результаты ваших экспериментов (строка 10), говорят, что вы нас обманываете. Откуда вы взяли это [0..255]?

Цитата Сообщение от Denuha Посмотреть сообщение
От 256 до 383 выводит положительные числа n-255. Почему?
Это где это? Смотрим на строку 6. Вы присваивали 350, а получилось 94. 94 = 350 - 255? Что-то не сходится...

Цитата Сообщение от Denuha Посмотреть сообщение
как работает 5-7 строка я понял.
Сомневаюсь. Пока что я наблюдаю полную путаницу.
0
Denuha
9 / 9 / 7
Регистрация: 01.07.2015
Сообщений: 88
27.10.2016, 23:36  [ТС] 5
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Вы уверены, что у вас char обладает таким диапазоном? Результаты ваших экспериментов (строка 10), говорят, что вы нас обманываете. Откуда вы взяли это [0..255]?
char занимает один байт (беззнаковый)

Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Это где это? Смотрим на строку 6. Вы присваивали 350, а получилось 94. 94 = 350 - 255? Что-то не сходится...
*256. Опечатался

Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Сомневаюсь. Пока что я наблюдаю полную путаницу.
Тема создана, чтоб объяснили.
0
TheCalligrapher
С чаем беда...
Эксперт CЭксперт С++
5904 / 2882 / 786
Регистрация: 18.10.2014
Сообщений: 5,277
28.10.2016, 00:20 6
Лучший ответ Сообщение было отмечено Denuha как решение

Решение

Цитата Сообщение от Denuha Посмотреть сообщение
char занимает один байт (беззнаковый)
char занимает один "байт" с количеством битов, определяемым реализацией. Чаще всего это 8.

Тип char является знаковым или беззнаковым в зависимости от реализации. Чаще всего он знаковый (по крайней мере по умолчанию). Знаковый он и в вашем случае. Т.е. диапазон его в вашем случае [-128, 127], а не [0, 255], как вы неверно предположили.

Переполнение знакового типа при конвертации приводит к результатам, определяемым реализацией. Сам язык тут никаких гарантий не дает.

У вас скорее всего просто остаются младшие 8 битов значения. Какой при этом получится результат - отрицательный или положительный - зависит от того, попадет ли в знаковый (старший) бит 0 или 1.

Например, 35010 - это 1010111102. Оставляем 8 битов 010111102 = 9410. 40010 - это 1100100002. Поэтому и получилось отрицательное значение 100100002 = -11210.

При передаче в variadic функцию, такую как printf, значения типа char конвертируются к типу int. -11210 в 32-битном типе int - это 111111111111111111111111100100002. При попытке "проинтерпретировать" это значение как unsigned int вы получили 429496718410.

Вот и все.
1
ValeryS
Модератор
7961 / 5930 / 785
Регистрация: 14.02.2011
Сообщений: 20,411
Завершенные тесты: 1
28.10.2016, 00:36 7
Цитата Сообщение от Denuha Посмотреть сообщение
Есть тип char с диапазоном значений [0..255]
нет у него диапазона
есть три типа(будем считать что байт 8 бит)
char
signed char диапазон -128...127
unsigned char диапазон 0...255
тип char может принимать вид и signed char и unsigned char
чаше всего меняется в настройках компилятора
причем в больших компах, по моему опыту, char по умолчанию знаковый
в микроконтроллерах беззнаковый
посему когда это критично, я лично, пишу явно

Добавлено через 5 минут
Цитата Сообщение от Denuha Посмотреть сообщение
От 256 до 383 выводит положительные числа n-255. Почему?
не совсем так. Попробуй ввести число 10000, 9745 никак не получишь
выводит число n%256
а вот знаковое или беззнаковое зависит от реализации char
впрочемTheCalligrapher уже все это описал
1
28.10.2016, 00:36
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.10.2016, 00:36

Аргумент типа char (*)[1000] несовместим с параметром типа char**
Здравствуйте! Есть вот такая структура: #define max 1000 struct expr { char s; int...

Добавление в массив типа char * одного элемента типа char
Дан класс Строка, содержащий указатель на char - адрес динамически выделенной для размещения...

Ошибка: "аргумент типа const char несовместим с параметром типа char*"
Существует много файловый проект на с++ 1)feed.cpp 2)feed.h 3)Source.cpp В файле feed.h...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, vBulletin Solutions, Inc.