二進位補碼和fmt.Printf:解開二進位表示之謎
使用有符號整數時,電腦使用二進位補碼表示負值。這與典型的二進位表示不同,其中符號由單獨的位元指示。例如,在二進位補碼中,整數 -5 表示為 1111 1011。
但是,使用 fmt.Printf 列印二進位表示可能會產生意外結果。例如,以下程式碼片段:
var i int8 = -5 fmt.Printf("%b", i)
令人驚訝地輸出 -101 而不是 1111 1011。這種差異導致了一個問題:二進制補碼是否真正用於內部表示,或者格式是否模糊正確的表示。
為了闡明這個問題,我們需要深入研究 fmt.Printf 如何格式化二進位數。罪魁禍首在於 fmt.integer 函數,該函數會自動將負符號整數轉換為正整數。此轉換涉及對整數取反並在輸出字串前面添加一個 - 符號。因此,-101 輸出是附加到 5 的二進位表示形式之後的 - 表示形式。
為了進一步示範這一點,將有符號整數轉換為無符號整數,然後使用fmt.Printf 對其進行格式化,產生正確的Two's補碼表示:
var u uint8 = uint(i) fmt.Printf("%b", u)
輸出11111011,剛好是-5 的補碼。
因此,Go 中帶符號整數的內部表示遵循補碼約定。格式化有符號整數時看似不正確的二進位表示是由 fmt.integer 執行的自動轉換和符號前置造成的。在 Go 中使用有符號整數和二進位表示時,理解這種行為至關重要。
以上是為什麼 fmt.Printf 顯示負整數的二進位表示與 Go 中預期的不同?的詳細內容。更多資訊請關注PHP中文網其他相關文章!