可能的重复:
64位移位问题 https://stackoverflow.com/questions/1024968/64bit-shift-problem
我在 Windows 8 64 位上使用 Visual Studio 2012,在调试模式下以 x64 为目标,使用 AMD Phenom II。
所以基本上...
uint64_t Foo = 0xFFFFFFFFFFFFFFFF << 64;//Foo is now 0x0000000000000000
uint64_t Derp = 64;
uint64_t Bar = 0xFFFFFFFFFFFFFFFF << Derp;//Foo is now 0xFFFFFFFFFFFFFFFF
使用较低的值(例如 63)可以恢复正常行为。
为什么会发生这种情况?我该如何解决?
更新:我切换到发布模式。你瞧,问题消失了并且都返回了 0。但是问题仍然处于调试模式,这是我需要调试代码的地方。
如果移位的值大于或等于位宽,则移位操作具有未定义的行为。
来自 C++11 草案第 5.8 p1 节:
操作数应为整型或无作用域枚举类型,并执行整型提升。
结果的类型是提升后的左操作数的类型。如果正确的操作数,则行为未定义
为负数,或者大于或等于提升的左操作数的位长度。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)