2017-01-24 2 views
-1

Предположим, у вас естьКак работает литье отрицательного числа на более широкий тип?

short num = -10; 
int num_casted = (int)num; 
std::cout << num_casted << endl; // prints -10. 

Интересно, почему num_casted еще -10 и не 0xFA000000.

Как отрицательное число меньшего типа преобразуется в biggen? Кто-нибудь просветит меня? Я предполагаю, что существует некоторая логика, за исключением заполнения пробела нулями ...

+0

Это наименее удивительный способ, действительно. 'num' имеет значение -10, поэтому' num_casted' является представлением 'int' -10. – chris

+3

[Расширение знака] (https://en.wikipedia.org/wiki/Sign_extension). Это преобразование значений, а не немного переинтерпретация, поэтому работа выполняется для того, чтобы вы могли получить согласованный '-10' вместо смещенного мусора. – Quentin

+0

Если вы конвертируете в более крупный тип той же подписанности, то этот более крупный тип может обязательно представлять одно и то же значение, поэтому он преобразуется в представление, имеющее то же значение. – user2079303

ответ

1

Предполагая архитектуру x86/x86-64 с представлением чисел 2C.

Для подписанных номеров отсутствующих бит заполнены знаковым битом (последний бит преобразованного значения). Для чисел без знака пробелы заполняются нулями.

Подписанное преобразование скомпилировано в команду movsx (mov с расширением знака) и беззнаковое преобразование с movzx (mov с нулевым расширением). Вероятно, существует несколько вариантов этих инструкций (для разных размеров аргумента, для целочисленной математики на SSE, для целочисленной математики на AVX2 и т. Д.).

0

Когда вы применяете более крупный целочисленный тип, вы должны указать . Было бы неразумно поступать иначе. Я считаю, что стандарт гарантирует это.

В дополнении 2 очень просто сделать число более широким, сохраняя одно и то же значение и знак - вы просто заполняете новые верхние биты тем же значением, что и бит знака. Для положительных чисел вы заполняете нуль, а для отрицательных чисел вы заполняете.

Смежные вопросы