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

时间:2012-08-05 14:52:59

标签: c++ 64-bit bit-manipulation shift

  

可能重复:
  64bit shift problem

我在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

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

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

2 个答案:

答案 0 :(得分:5)

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

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

  

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

答案 1 :(得分:4)

我认为在C ++中未定义移位整数或更大的大小。

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

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

uint64_t Bar = 0xFFFFFFFFFFFFFFFF << (Derp / 2);
Bar <<= Derp - (Derp / 2);