首頁  >  文章  >  後端開發  >  為什麼 fmt.Printf 對於以補碼表示的有符號整數輸出“-101”?

為什麼 fmt.Printf 對於以補碼表示的有符號整數輸出“-101”?

DDD
DDD原創
2024-11-01 13:31:29208瀏覽

Why Does fmt.Printf Output

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

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