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