首頁  >  文章  >  後端開發  >  為什麼 fmt.Printf 顯示負整數的二進位表示與 Go 中預期的不同?

為什麼 fmt.Printf 顯示負整數的二進位表示與 Go 中預期的不同?

Mary-Kate Olsen
Mary-Kate Olsen原創
2024-11-02 16:11:02143瀏覽

Why does fmt.Printf show a different binary representation for negative integers than expected in Go?

二進位補碼和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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn