在C++中将64位值向左移64位会产生奇怪的结果

ret*_*998 4 c++ 64-bit bit-manipulation shift

可能重复:
64位移位问题

我在Windows 8 64位上使用Visual Studio 2012,在调试模式下使用AMD Phenom II定位x64.
基本上......

uint64_t Foo = 0xFFFFFFFFFFFFFFFF << 64;//Foo is now 0x0000000000000000
uint64_t Derp = 64;
uint64_t Bar = 0xFFFFFFFFFFFFFFFF << Derp;//Foo is now 0xFFFFFFFFFFFFFFFF
Run Code Online (Sandbox Code Playgroud)

使用较低的值(如63)可恢复正常行为.
为什么会发生这种情况,我该如何解决这个问题呢?

更新:我切换到发布模式.瞧,问题消失了,两者都返回了0.但问题仍然是调试模式,这是我需要调试代码的地方.

jxh*_*jxh 5

如果您移动大于或等于位宽的值,则移位操作具有未定义的行为.

从C++ 11草案的第5.8节p1开始:

操作数应为整数或无范围的枚举类型,并执行整体促销.结果的类型是提升的左操作数的类型.如果右操作数为负数,或者大于或等于提升左操作数的位长度,则行为未定义.