首頁 > 後端開發 > Golang > 主體

為什麼 fmt.Printf 在 Go 中列印有符號整數的二進位表示時輸出'-101”?

Barbara Streisand
發布: 2024-11-02 07:28:29
原創
269 人瀏覽過

Why Does fmt.Printf Output

二進位補碼和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 &amp;&amp; a < 0
   166      if negative {
   167          a = -a
   168      }
登入後複製

此轉換需要添加“-”前綴格式化字串,解釋了先前觀察到的“-101”輸出。

本質上,該值的內部表示遵循補碼約定,而 fmt.integer 中的格式化過程會轉換負符號整數與其正值相對應,導致意想不到的輸出。

以上是為什麼 fmt.Printf 在 Go 中列印有符號整數的二進位表示時輸出'-101”?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!