左移int的行为

use*_*214 3 c++ c++11

以下是未定义的,为什么?

int i = 0xFF;
unsigned int r = i << 24;
Run Code Online (Sandbox Code Playgroud)

Mik*_*our 7

除非int类型超过32位,否则从技术上讲,该行为是未定义的.

从C++ 11,5.8/2(描述表达式E1 << E2):

如果E1具有带符号类型和非负值,并且E1×2 E2在结果类型中可表示,那么这就是结果值; 否则,行为未定义.

结果类型i << 24是(签名)int; 如果它有32位或更少,则0xff * 2^24 == 0xff000000不可表示(最大可表示的32位有符号值0x7fffffff),因此行为未定义,如该子句中所指定.