5

可能重复:
64bit shift问题

我在 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。但问题仍然处于调试模式,这是我需要调试代码的地方。

4

2 回答 2

7

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

来自 C++11 草案中的第 5.8 p1 节:

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

于 2012-08-05T14:59:47.317 回答
4

我相信 C++ 中未定义整数大小或更大的移位。

您的第一个示例正在编译时进行评估,因为它只涉及常量。您的第二个示例由处理器在运行时计算。

您可以将班次分成两部分:

uint64_t Bar = 0xFFFFFFFFFFFFFFFF << (Derp / 2);
Bar <<= Derp - (Derp / 2);
于 2012-08-05T14:58:17.823 回答