Почему странный результат при конвертации unsigned long x = (char)(128)?

jsa54513
Дата: 02.11.2014 07:00:30
char p = 128;
unsigned long l = p;


Лонг побитно получился такой:

1000000011111111111111111111111111111111111111111111111111111111

Ну да, знаковое в беззнаковое конвертировать -- это конечно ербалайство, спору нет. Но всё равно интересно, как оно внутри так устроено, что так получается? Ведь если сделать unsigned char = char, то получилось бы 128, зачем в лонге единицы появились?
RWolf
Дата: 02.11.2014 12:14:30
jsa54513,

На самом деле в p лежит число -128, потому что сработало приведение типов при присвоении (константа 128 не помещается в допустимый диапазон для signed char).
Dimitry Sibiryakov
Дата: 02.11.2014 13:09:41

jsa54513
зачем в лонге единицы появились?

Расширение знака.

Posted via ActualForum NNTP Server 1.5

jsa54513
Дата: 02.11.2014 14:36:29
RWolf
jsa54513,

На самом деле в p лежит число -128, потому что сработало приведение типов при присвоении (константа 128 не помещается в допустимый диапазон для signed char).

Это понятно.
jsa54513
Дата: 02.11.2014 14:36:49
Dimitry Sibiryakov
jsa54513
зачем в лонге единицы появились?

Расширение знака.

А зачем? Что за тупая операция?
Basil A. Sidorov
Дата: 02.11.2014 15:17:40
Затем, чтобы расширение знакового числа от меньшего к большему давало правильный результат.
jsa54513
Дата: 02.11.2014 16:14:43
Basil A. Sidorov
Затем, чтобы расширение знакового числа от меньшего к большему давало правильный результат.

Так и получился неправильный результат.
Basil A. Sidorov
Дата: 02.11.2014 16:18:38
Это как считать.
Если беззнаковый байт со значением 128 рассматривать как знаковый, то получается -128.
Anatoly Moskovsky
Дата: 02.11.2014 16:39:44
jsa54513
Так и получился неправильный результат.

А не надо было впихивать в char то, что в него не помещается :)
RWolf
Дата: 02.11.2014 16:51:04
jsa54513,

Смотри, ты записал в signed char число -128. После этого ты присвоил его переменной unsigned long (диапазон допустимых значений 0…263-1). Как компилятор должен обработать такой ход? Он поступает так: расширяет разрядность источника до 8 байт (диапазон -262…262-1), после чего забывает про знак, вот и получилось число с кучей единиц в старших битах.