Другие языки программирования и технологии

С++ преобразование отрицательных чисел в беззнаковый тип

Каким образом происходит такое преобразование, если предположить что тип char занимает 1 байт (0...255)

unsigned char a;
a = -1;

Стандарт гарантирует такое преобразование?
255 получится
char - 8 бит, из них 1 идет под знак
-1 в двоичной записи будет 11111111 (дополнительный код)
у unsigned cgar используются все 8 бит (нет знака), а значит, 11111111 превращается в 255
Иван Каримов
Иван Каримов
38 457
Лучший ответ
Андрей Кравченко Дополнительный код.. точно, спасибо
В бинарном представлении -1 для signed char и unsigned char будет представлен одинаково: 11111111
В знаковых типах данных нулевой разряд (первый слева) отдан под знак, где 1 означает отрицательное значение, а 0 - положительное. По умолчанию все целочисленные константы имеют тип данных int, который зависит от платформы. Это следует учитывать при явном и неявном преобразовании.
Сергей Глушко
Сергей Глушко
77 324
Андрей Кравченко Т. е. в знаковых типах отрицательные числа тоже записываются в дополнительном коде?
Просто раньше думал что -1 в знаковом это 1000 0001
Согласно документу N3242=11-0012, р. 4.7 п. 2 If the destination type is unsigned, the resulting value is the least unsigned integer congruent to the source integer (modulo 2^n where n is the number of bits used to represent the unsigned type).
Т. е. там будет 255. Простое преобразование в дополнительном коде.
Произойдет неявное преобразование (-1) к unsigned char, комплитятор может ругнуться ворнингами, на всякий случай всегда пиши так: a=(unsigned char)(-1);
Нуржан Исенив
Нуржан Исенив
5 596
Андрей Кравченко Значение какое будет? В учебнике написано 255, но как так происходит я не понимаю.
Преобразование следующее: для того, чтобы сменить знак у числа, нужно инвертировать все его биты (то есть 0 поменять на 1, а 1 на 0) и затем прибавить 1. К примеру: число 1 размеров в байт. Хотим сделать его отрицательным. В двоичной системе счисления 1 — это 00000001. Инвертируем: получается 11111110. Прибавляем 1, выходит 11111111. Это и есть -1. А если представить его в беззнаковом виде? То это число 255! Если число отрицательное, перевод происходит также.