【发布时间】:2012-06-30 00:31:07
【问题描述】:
考虑以下代码:
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 类型的宽度)或者这是未指定的行为?
【问题讨论】:
考虑以下代码:
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 按位移位运算符中有以下块:
如果右操作数的值为负数或为 大于或等于提升的左操作数的宽度,则行为未定义。
所以,未定义。小心点。
【讨论】: