如何从 shl 获得大于 2^32 的结果?
声明...
const
n = 2 shl 33
将把常量n
设置为值4,没有任何编译器抱怨!
另外...
Caption := IntToStr(2 shl 33);
...返回 4 而不是 8589934592。 看起来编译器是这样计算的:
2 先令 33 = 2 先令(33 和 $1F)= 4
但没有任何警告或溢出。
问题仍然存在。
const
n: int64 = 2 shl 33;
如果我们声明:常量中的数字仍然是 4,而不是 8589934592,
有什么合理的解决方法吗?
Declaration...
const
n = 2 shl 33
will set constant n
to value 4 without any compiler complaint!
Also...
Caption := IntToStr(2 shl 33);
...return 4 instead 8589934592.
It looks like the compiler calculates like this:
2 shl 33 = 2 shl (33 and $1F) = 4
But without any warning or overflow.
The problem remains if we declare:
const
n: int64 = 2 shl 33;
The number in constant is still 4 instead 8589934592.
Any reasonable work around?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
根据 Delphi 编译器和 Windows 7 程序员模式下的计算器,您正在寻找错误的结果。 ,您想要的答案实际上是
2 shl 32
。)您需要将
shl
的两侧转换为Int64
:(顺便说一句 在
当前的文档(适用于 XE2,但也适用于 Delphi 的早期版本)
基本整数类型
。但是,该页面提到只需将其中一个操作数转换为 Int64;我的测试表明,它要求在上面的 const 声明中对两个操作数进行类型转换 - 仅对一个操作数(无论是哪一个)进行类型转换也会导致“n = 4;”。You're looking for the wrong results, according to both the Delphi compiler and Windows 7's calculator in programmer mode. (The answer you're wanting is actually
2 shl 32
, BTW.)You need to cast both sides of the
shl
toInt64
:This produces
The current documentation (for XE2, but applies to earlier versions of Delphi as well) notes this in
Fundamental Integer Types
. However, that page mentions only having to cast one of the operands asInt64
; my test shows it to require both operands be typecast in theconst
declaration above - typecasting only one (regardless of which one) also resulted in `n = 4;'.