C标准对于比特类型宽度的位移更多的比特说了些什么?

请考虑以下代码:

int i = 3 << 65; 

我希望结果是i==0 ,但实际结果是i==6 。 通过一些测试,我发现使用以下代码:

 int i, s; int a = i << s; int b = i << (s & 31); 

ab的值始终相同。

C标准是否有关于移位超过32位( int类型的宽度)的说法,或者这是未指定的行为?

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

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

所以, 未定义 。 小心。