Как продвигаются операнды
У меня есть следующий код в C:
int l;
short s;
l = 0xdeadbeef;
s = l;
Предполагая, что int равен 32 битам, а short равен 16 битам, при выполнении s = l s будет переведен в 32 бита, а после назначения в s будут сохранены только младшие 16 битов. Мой вопрос заключается в том, что, когда s увеличивается до 32 бит, будут ли дополнительные 16 бит установлены в 0x0 или 0xf?
3 ответа
На самом деле s
не продвигается вообще. поскольку s
подписан и l
слишком большой, чтобы поместиться s
в этом случае присваивание l для s является поведением, определяемым реализацией.
6.3.1.3-3
В противном случае новый тип подписывается, и значение не может быть представлено в нем; либо результат определяется реализацией, либо определяется определяемый реализацией сигнал.
У ассемблера есть операция для перемещения всего регистра или его части (MOV EAX, 0
, MOV AX, 0
, MOV AL, 0
- соответственно 32 бита, 16 бит, 8 бит). Как short
16-разрядное целое число MOV AX, 0
Форма будет использоваться, хотя, это зависит от реализации компилятора.
Я предполагаю, что вы собираетесь продвигать s к более широкому типу. Это зависит от типа пункта назначения: подписанный или неподписанный. Если тип места назначения подписан, то будет проведена подписанная акция. В противном случае - неподписанная акция. Подписанное продвижение заполняет старшие биты на 0 или 1 в зависимости от знака повышенного значения.