データ損失なしで uint64 を int64 に変換する
提供されたコード:
<code class="go">var x uint64 = 18446744073709551615 var y int64 = int64(x)</code>
結果 y は -1 になります。これはデータ損失によるものではなく、int64 での uint64 の最大値の表現によるものです。 18446744073709551615 と -1 は両方とも、同じバイナリ値 0xFFFFFFFFFFFFFFFF を表します。
ただし、乱数ジェネレーターの統計的特性の保持に関して提起された懸念は有効です。この場合、エンコーダとデコーダを使用する必要はありません。
統計的プロパティを変更せずに uint64 を int64 に変換するには:
<code class="go">var x uint64 = 18446744073709551615 - 3 var y int64 = int64(x)</code>
ここで、x は 3 減分され、結果は次のようになります。 y の値は -4 です。この操作は数値のバイナリ表現を維持し、統計的プロパティが確実に保持されるようにします。
例:
<code class="go">var x uint64 = 18446744073709551615 - 3 var y int64 = int64(x) fmt.Printf("%b\n", x) // Prints: 1111111111111111111111111111111111111111111111111111111111111100 fmt.Printf("%b or %d\n", y, y) // Prints: -100 or -4</code>
これは、乱数ジェネレータの統計的プロパティが変換中にそのまま維持されることを示しています。 .
以上が統計プロパティを失わずに「uint64」を「int64」に変換するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。