C标准对于比特类型宽度的位移更多的比特说了些什么?
请考虑以下代码:
int i = 3 << 65;
我希望结果是i==0
,但实际结果是i==6
。 通过一些测试,我发现使用以下代码:
int i, s; int a = i << s; int b = i << (s & 31);
a
和b
的值始终相同。
C标准是否有关于移位超过32位( int
类型的宽度)的说法,或者这是未指定的行为?
根据我的WG12 / N1124草案( 不是标准,但对我来说足够好),在6.5.7 按位移位运算符中有以下块:
如果右操作数的值为负或大于或等于提升的左操作数的宽度,则行为未定义。
所以, 未定义 。 小心。