二進位補碼和fmt.Printf 令人費解的輸出
在電腦科學領域,二進位補碼是用來表示的普遍方法內部有符號整數。這種表示法涉及翻轉位並加一來表示負數。例如,在二進位補碼中,-5 將以二進位格式表示為「1111 1011」(相當於 ^5 1)。
嘗試使用 fmt.Printf 列印有符號整數的二進位表示形式時會出現困惑。考慮以下程式碼片段:
var i int8 = -5 fmt.Printf("%b", i)
預期,此程式碼應輸出“1111 1011”,即 -5 的補碼表示形式。然而,實際輸出是“-101”,這偏離了這個期望。這就提出了一個問題:該值在內部以二進制補碼格式存儲,還是使用了不同的表示形式?
有趣的是,在列印之前將值轉換為無符號整數會產生所需的結果:
var u uint8 = uint(i) fmt.Printf("%b", u)
這會輸出“11111011”,即-5 的精確二進位補碼表示。
差異的關鍵在於 fmt.Printf 如何處理二進位數字的格式。仔細檢查fmt.integer 函數,可以清楚地看到,在格式化過程中,負符號整數被轉換為正整數:
165 negative := signedness == signed && a < 0 166 if negative { 167 a = -a 168 }
此轉換需要添加“-”前綴格式化字串,解釋了先前觀察到的“-101”輸出。
本質上,該值的內部表示遵循補碼約定,而 fmt.integer 中的格式化過程會轉換負符號整數與其正值相對應,導致意想不到的輸出。
以上是為什麼 fmt.Printf 在 Go 中列印有符號整數的二進位表示時輸出“-101”?的詳細內容。更多資訊請關注PHP中文網其他相關文章!