情報を保持した uint64 から int64 への変換
プログラミングの領域では、データ型を正確に処理することが不可欠です。次のコードを考えてみましょう。
<code class="go">var x uint64 = 18446744073709551615 var y int64 = int64(x)</code>
実行すると、y の値は -1 になります。これは、元の数値から有意なビットが切り捨てられているように見えるため、混乱を招く結果になります。この問題を解決するために、この変換の影響を詳しく調べてみましょう。
ビット値の保持
予想に反して、int64(x) による変換ではすべてのビットが保持されます。 int64 の範囲を超える先頭 64 ビットを含む、x からのデータ。これは、y と x がバイナリ表現で同一のビット パターンを共有していることを意味します。
uint64(18446744073709551615) = 0xFFFFFFFFFFFFFFFF int64(-1) = 0xFFFFFFFFFFFFFFFF
したがって、y の値は、-1 として表されていても、数学的には uint64 の対応する x と等価です。
明確さの例
説明のために、少し異なる数値を考えてみましょう:
<code class="go">var x uint64 = 18446744073709551615 - 3</code>
この場合、y = -4 であり、変換時に失われたビットは適切に維持されます。バイナリの場合:
1111111111111111111111111111111111111111111111111111111111111100 (x) -100 (y)
変換では、単純に先頭の 63 ビットが負の数の大きさとして解釈され、それに応じて符号ビットが設定されます。これにより、特定の範囲内で uint64 と int64 間のロスレス変換が可能になり、乱数ジェネレーターにとって重要な統計的特性が維持されます。
以上がuint64 を int64 に変換すると -1 になるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。