Поведение со смещением влево int - PullRequest
3 голосов
/ 07 декабря 2011

Не определено ли следующее и почему?

int i = 0xFF;
unsigned int r = i << 24;

Ответы [ 2 ]

7 голосов
/ 07 декабря 2011

Технически поведение не определено, если только тип int не содержит более 32 бит.

Из C ++ 11, 5.8 / 2 (описывает выражение E1 << E2):

если E1 имеет тип со знаком и неотрицательное значение, а E1 × 2 E2 представимо в типе результата, то это результирующее значение;в противном случае поведение не определено.

Тип результата i << 24 - это (подписано) int;если он имеет 32 бита или менее, то 0xff * 2^24 == 0xff000000 не представимо (максимальное представимое 32-битное значение со знаком равно 0x7fffffff), поэтому поведение не определено, как указано в этом пункте.

2 голосов
/ 07 декабря 2011

Согласно N3242 сечения 5.8 Операторы сдвига :

Операторы сдвига << и >> группируются слева направо.

    shift-expression:<br/>        additive-expression<br/>        shift-expression << additive-expression<br/>        shift-expression >> additive-expression

Операнды должны иметь целочисленный или незаданный тип перечисления, и выполняются интегральные преобразования.Тип результата - тип повышенного левого операнда. Поведение не определено, если правый операнд имеет отрицательный или больше или равен длине в битах повышенного левого операнда .

Так что мойответ?Зависит от количества бит в вашем левом операнде (зависит от вашей системы).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...