二進位補碼與fmt.Printf 二進位輸出
當電腦使用二進位補碼表示有符號整數時,像-5 這樣的值儲存為位元模式“1111 1011”。但是,當嘗試使用 fmt.Printf 列印此二進位表示法時,如下所示:
var i int8 = -5
fmt.Printf("%b", i)
輸出意外顯示「-101」。為什麼會發生這種情況,內部是否使用了二進位補碼?
二進位格式的問題
差異在於 fmt.Printf 處理二進位格式的方式。當格式化負符號整數時,它會將其轉換為正值,然後在格式化字串前附加“-”號。
查看fmt.Printf的源代碼,我們發現fmt.integer轉換在格式化之前將有符號整數轉換為正值:
negative := signedness == signed && a 無符號與有符號輸出
為了示範這一點,請考慮以下程式碼:
var u uint8 = uint(i)
fmt.Printf("%b", u)
這裡,我們在列印之前將 i 轉換為無符號整數。這次,輸出正確顯示“11111011”,這是 -5 的補碼。
結論
要正確列印符號整數的二進位表示形式,請使用fmt.Printf,我們應該先使用無符號型別將其轉換為正整數。這可確保 fmt.Printf 不會自動將值轉換為負值並在前面加上「-」符號。
免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。
Copyright© 2022 湘ICP备2022001581号-3