左移int的行为

时间:2011-12-07 10:50:40

标签: c++ c++11

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

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

2 个答案:

答案 0 :(得分:7)

除非int类型的位数超过32位,否则行为在技术上是未定义的。

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

  

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

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

答案 1 :(得分:2)

根据N3242部分 5.8 Shift运算符

  

移位运算符&lt;&lt;和&gt;&gt;从左到右分组。

    shift-expression:
additive-expression
shift-expression << additive-expression
shift-expression >> additive-expression
     

操作数应为整数或无范围的枚举类型,并执行整体促销。结果的类型是提升的左操作数的类型。 如果右操作数为负,或大于或等于提升的左操作数的位长度,则行为未定义。

那么我的答案呢?取决于左操作数中的位数(取决于您的系统)。