宣言...

const
  n = 2 shl 33

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

还...
Caption := IntToStr(2 shl 33);

...返回4,而不是8589934592。
看起来编译器是这样计算的:



但是没有任何警告或溢出。

如果我们声明,问题仍然存在:
const
  n: int64 = 2 shl 33;

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

有合理的解决方法吗?

最佳答案

根据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;”。

关于delphi - 如何从shl获得大于2 ^ 32的结果?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8127693/

10-09 09:33