MB をバイトに変換する小さな関数を書きましたが、int64 にバグがあるようです。ドキュメントによると、int64 の範囲は -9223372036854775808 から 9223372036854775807 ですが、私の結果は大きく異なります。
Const FreeSpace = 67100;
var FreeSpaceConverted :int64;
.
.
.
FreeSpaceConverted := FreeSpace shl 20;
FreeSpace に 67100 の値を使用すると、70359449600 ではなく 1639972864 の値になります。変換がスペースを使い果たし、ラップアラウンドしたことは明らかです。int64 の実際のサイズは 70359449600 - 1639972864 = 68719476736 = 2^36 のようですが、2^63-1 のはずです。36 の指数はかなり奇妙に見えます。コンパイラ自体の数字のひねりでしょうか??
また、次の代替手段を使用すると、「変換または算術演算でのオーバーフロー」というエラーが発生します。
FreeSpaceConverted := FreeSpace * 1024 * 1024;
一方、次の代替手段は機能します。
FreeSpaceConverted := FreeSpace * 1024;
FreeSpaceConverted := FreeSpaceConverted * 1024;
これは正常な動作ですか? もしそうなら、このすべての理由は何ですか?