宣言...
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/