二進位補碼和fmt.Printf 二進位輸出
當電腦使用二進位補碼表示有符號整數時,像-5 這樣的值儲存為位元模式“1111 1011”。但是,當嘗試使用 fmt.Printf 列印此二進位表示形式時,如下所示:
<code class="go">var i int8 = -5 fmt.Printf("%b", i)</code>
輸出意外地顯示「-101」。為什麼會發生這種情況?內部是否使用了二進制補碼?
二進位格式的問題
差異在於 fmt.Printf 處理二進位格式的方式。當格式化負符號整數時,它會將其轉換為正值,然後在格式化字串前附加“-”號。
查看fmt.Printf 的源代碼,我們發現fmt.integer 轉換在格式化之前將有符號整數轉換為正值:
<code class="go"> negative := signedness == signed && a < 0 if negative { a = -a }</code>
無符號與有符號輸出
為了示範這一點,請考慮以下程式碼:
<code class="go">var u uint8 = uint(i) fmt.Printf("%b", u)</code>
在這裡,我們在列印之前將i 轉換為無符號整數。這次,輸出正確顯示“11111011”,這是 -5 的補碼。
結論
要正確列印有符號整數的二進位表示,請使用fmt.Printf,我們應該先使用無符號類型將其轉換為正整數。這可確保 fmt.Printf 不會自動將值轉換為負值並在前面加上「-」符號。
以上是為什麼 fmt.Printf 對於以補碼表示的有符號整數輸出'-101”?的詳細內容。更多資訊請關注PHP中文網其他相關文章!