1 << 31产生错误,“'''表达式的结果未定义”

如果我在32位平台上声明了int类型的值并执行以下操作:

int32_t mask; mask = 1 << 31: // produces 2147483648 (or 0x80000000) 

有人可以帮助我理解为什么上面的行会产生警告:

 The result of the '<<' expression is undefined 

2 31int32_t不可表示,其从-2 31变为(2 31 -1)。 这是C11和C ++ 11中的未定义行为,以及C ++ 14中定义的实现。

C11§6.5.7/ p4(引用N1570):

E1 << E2的结果是E1左移E2位位置; 腾出的位用零填充。 [...]如果E1具有有符号类型和非负值,并且E1 × 2 E2可在结果类型中表示,那么这就是结果值; 否则,行为未定义。

N3337§5.8[expr.shift] / p2中的C ++ 11规则几乎完全相同。 由于2 31不可表示,因此行为未定义。

C ++14§5.8[expr.shift] / p2(引用N3936;另见CWG第1457期 ):

E1 << E2的值是E1左移E2位位置; 空位是零填充的。 [...]否则,如果E1具有有符号类型和非负值,并且E1×2 E2可在结果类型的相应无符号类型中表示,则转换为结果类型的该值是结果值; 否则,行为未定义。

由于2 31在无符号的32位int中是可表示的,因此定义了行为,结果是2 31转换为int32_t ; 此转换是根据§4.7[conv.integral] / p3实现定义的。 在使用二进制补码的典型系统中,你得到-2 31