如何从shl获得大于2 ^ 32的结果?

时间:2011-11-14 20:33:02

标签: delphi 64-bit bit-shift

...宣言

const
  n = 2 shl 33

将常量n设置为值4,无需任何编译器投诉!

也...

Caption := IntToStr(2 shl 33);

...返回4而不是8589934592。 看起来编译器计算如下:

  

2 shl 33 = 2 shl(33和$ 1F)= 4

但没有任何警告或溢出。

如果我们宣布:

,问题仍然存在
const
  n: int64 = 2 shl 33;

常数中的数字仍然是4而不是8589934592。

任何合理的工作?

1 个答案:

答案 0 :(得分:13)

根据Delphi编译器和Windows 7程序员模式的计算器,你正在寻找错误的结果。 (你想要的答案实际上是2 shl 32,BTW。)

您需要将shl的两边都投放到Int64

const
  n = Int64(2) shl Int64(33);

这会产生

N = 17179869184;

当前documentation(对于XE2,但也适用于早期版本的Delphi)在Fundamental Integer Types中注明了这一点。但是,该页面提到只需要将其中一个操作数转换为Int64;我的测试显示它要求两个操作数都在上面的const声明中进行类型转换 - 只对一个(无论哪一个)进行类型转换也导致`n = 4;'。