Как продвигаются операнды

У меня есть следующий код в C:

        int l;
        short s;

        l = 0xdeadbeef;
        s = l;

Предполагая, что int равен 32 битам, а short равен 16 битам, при выполнении s = l s будет переведен в 32 бита, а после назначения в s будут сохранены только младшие 16 битов. Мой вопрос заключается в том, что, когда s увеличивается до 32 бит, будут ли дополнительные 16 бит установлены в 0x0 или 0xf?

Источник: http://www.phrack.com/issues.html?issue=60&id=10

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 в зависимости от знака повышенного значения.

Другие вопросы по тегам