ホームページ > バックエンド開発 > Golang > uint64 を int64 に変換すると -1 になるのはなぜですか?

uint64 を int64 に変換すると -1 になるのはなぜですか?

Linda Hamilton
リリース: 2024-10-30 11:00:03
オリジナル
222 人が閲覧しました

 Why Does Converting a uint64 to an int64 Result in -1?

情報を保持した 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 サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート