Технически поведение не определено, если только тип int
не содержит более 32 бит.
Из C ++ 11, 5.8 / 2 (описывает выражение E1 << E2
):
если E1 имеет тип со знаком и неотрицательное значение, а E1 × 2 E2 представимо в типе результата, то это результирующее значение;в противном случае поведение не определено.
Тип результата i << 24
- это (подписано) int
;если он имеет 32 бита или менее, то 0xff * 2^24 == 0xff000000
не представимо (максимальное представимое 32-битное значение со знаком равно 0x7fffffff
), поэтому поведение не определено, как указано в этом пункте.