首頁 >後端開發 >Golang >為什麼在 Go 和 C 中將 -1 列印為十六進位會產生不同的結果?

為什麼在 Go 和 C 中將 -1 列印為十六進位會產生不同的結果?

Mary-Kate Olsen
Mary-Kate Olsen原創
2024-11-16 00:58:03238瀏覽

Why does printing -1 as hexadecimal in Go and C produce different results?

理解Go 和C 之間的十六進位列印差異:-1 的情況

在Go 中,列印整數的% x 格式代表以十六進位表示的值。這與 C 的 %x 不同,後者列印有符號整數的記憶體表示形式。這種差異會導致列印負整數 -1 時出現意外結果。

在Go 中:

var x uint64 = 1 << 64 - 1
fmt.Printf("%x\n", x)

輸出:

ffffffffffffffffffff

這裡,%x 正確列印無符號值的十六進位表示形式1<<64 - 1.

In C:

#include <stdio.h>
int main() {
  uint64_t x = 1LL << 64 - 1;
  printf("%x\n", (long long)x);
}

輸出:

-1

在C 中,%x 印有符號整數值-1,似乎會產生一個帶有前導“-”的負十六進制數。然而,事實並非如此; '-' 符號表示整數為負數,十六進位值 ffff...ff 是 -1 的 2 補碼表示形式。

Go 強制執行嚴格型別化,要求明確型別轉換將有符號整數視為未簽章。在Go 中將-1 以無符號值列印:

i := -1 // type int
fmt.Printf("%x", uint(i))

輸出:

ffffffff

此方法將有符號整數-1 轉換為其無符號對應值,從而得到正確的十六進位表示形式.

Go 將負整數列印為有符號值的預設行為允許簡潔的表示,但可能會導致意外結果十六進位上下文。理解這些差異對於在 Go 中有效編寫程式碼至關重要。

以上是為什麼在 Go 和 C 中將 -1 列印為十六進位會產生不同的結果?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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