我写了一个小函数来将 MB 转换为字节,但是 int64 中似乎有一个错误。根据文档,int64 的范围从 -9223372036854775808 到 9223372036854775807,但我的结果不同......很多:
Const FreeSpace = 67100;
var FreeSpaceConverted :int64;
.
.
.
FreeSpaceConverted := FreeSpace shl 20;
对 FreeSpace 使用 67100 的值会得到 1639972864 而不是 70359449600 的值。很明显,转换用完了空间并回绕。int64 的实际大小似乎是 70359449600 - 1639972864 = 68719476736 = 2^36 而它应该是 2^63-1。36 的指数看起来很奇怪。这可能是编译器本身的数字扭曲吗?
此外,使用以下替代方法会给出错误“转换或算术运算溢出”,即使它不应该:
FreeSpaceConverted := FreeSpace * 1024 * 1024;
另一方面,以下替代方法确实有效:
FreeSpaceConverted := FreeSpace * 1024;
FreeSpaceConverted := FreeSpaceConverted * 1024;
这是正常行为吗?如果是这样,这一切的原因是什么?