...宣言
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。
任何合理的工作?
答案 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;'。