理解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中文網其他相關文章!