Как продвигаются операнды - PullRequest
0 голосов
/ 09 марта 2012

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

        int l;
        short s;

        l = 0xdeadbeef;
        s = l;

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

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

Ответы [ 3 ]

2 голосов
/ 09 марта 2012

На самом деле s вообще не продвигается.Поскольку s подписано, а l слишком велико, чтобы поместиться в s, в этом случае присваивание l для s является поведением, определяемым реализацией.

6.3.1.3-3

В противном случае новый тип подписывается и значение не может быть представлено в нем;либо результат определяется реализацией, либо определяется сигнал реализации.

0 голосов
/ 09 марта 2012

Я предполагаю, что вы собираетесь продвигать s к более широкому типу. Это зависит от типа пункта назначения: подписанный или неподписанный. Если тип места назначения подписан, то будет проведена подписанная акция. В противном случае - неподписанная акция. Подписанное продвижение заполняет старшие биты на 0 или 1, в зависимости от знака повышенного значения.

0 голосов
/ 09 марта 2012

Ассемблер имеет операцию для перемещения целого регистра или его части (MOV EAX, 0, MOV AX, 0, MOV AL, 0 - соответственно 32 бита, 16 бит, 8 бит).Поскольку short является 16-разрядным целым числом, будет использоваться форма MOV AX, 0, хотя это зависит от реализации компилятора.

...