將 uint64 轉換為 int64 並保留資訊
在程式設計領域,必須精確處理資料型別。考慮以下程式碼:
<code class="go">var x uint64 = 18446744073709551615 var y int64 = int64(x)</code>
執行後,y 的值變為 -1,這是一個令人困惑的結果,因為它似乎截斷了原始數字的重要位元。為了解決這個問題,讓我們深入研究一下這種轉換的含義。
保留位元值
與預期相反,透過 int64(x) 進行的轉換保留了所有位元來自 x,包括超出 int64 範圍的前導 64 位元。它表示 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中文網其他相關文章!