可能重复:
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.但是问题仍然存在于调试模式,这是我需要调试代码的地方。
答案 0 :(得分:5)
如果移动大于或等于位宽的值,则移位操作具有未定义的行为。
从C ++ 11草案的第5.8节p1开始:
操作数应为整数或无范围的枚举类型,并执行整体促销。 结果的类型是提升的左操作数的类型。如果右操作数,则行为未定义 是负的,或大于或等于提升的左操作数的位数。
答案 1 :(得分:4)
我认为在C ++中未定义移位整数或更大的大小。
您的第一个示例是在编译时进行评估,因为它只涉及常量。第二个示例由处理器在运行时计算。
您可以将班次分为两部分:
uint64_t Bar = 0xFFFFFFFFFFFFFFFF << (Derp / 2);
Bar <<= Derp - (Derp / 2);