这是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具有带符号的类型和负值,则结果值为 是实现定义的。
答案 0 :(得分:11)
...如果右操作数的值为负或大于 或等于提升后的左操作数的宽度,其行为是 未定义。
使用clang,gcc和icc,如果您尝试以大于或等于移位值宽度的常数进行移位,则您将get a warning,而您甚至不需要任何额外的命令-行标志。