二進制補碼和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 中使用有符號整數和二進位表示時,理解這種行為至關重要。
免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。
Copyright© 2022 湘ICP备2022001581号-3