以下是未定义的,为什么?
int i = 0xFF;
unsigned int r = i << 24;
答案 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操作数应为整数或无范围的枚举类型,并执行整体促销。结果的类型是提升的左操作数的类型。 如果右操作数为负,或大于或等于提升的左操作数的位长度,则行为未定义。
那么我的答案呢?取决于左操作数中的位数(取决于您的系统)。