10

考虑以下代码:

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)或者这是未指定的行为?

4

1 回答 1

16

从我的 WG12/N1124 草案(不是标准,但对我来说足够好),6.5.7位移位运算符中有以下块:

如果右操作数的值为负数或大于或等于提升的左操作数的宽度,则行为未定义。

所以,未定义。当心。

于 2012-06-30T00:35:12.230 回答