按位移位运算符似乎要环绕吗?

时间:2019-06-05 17:50:12

标签: c bitwise-operators bit-shift

这是Windows 7 32位Visual Studio 2017,位于C文件中。

int i = 65536;

按预期,

i >> 0 = 65536
i >> 1 = 32768
  :
  :
i >> 16 = 1
i >> 17 to 31 = 0.

i >> 32再次神奇地达到了65536。那怎么合法?

ISO / IEC 9899:TC2表示以下内容,我认为C ++规范相同吗?

  

E1 >> E2的结果是E1右移E2位的位置。 如果E1有   无符号类型,或者如果E1具有带符号类型和非负值,   结果的值是E1 /的商的整数部分   2 ^ E2。如果E1具有带符号的类型和负值,则结果值为   是实现定义的。

1 个答案:

答案 0 :(得分:11)

6.5.7p3

  

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

使用clang,gcc和icc,如果您尝试以大于或等于移位值宽度的常数进行移位,则您将get a warning,而您甚至不需要任何额外的命令-行标志。