首页 >后端开发 >Golang >为什么在 Go 和 C 中将 -1 打印为十六进制会产生不同的结果?

为什么在 Go 和 C 中将 -1 打印为十六进制会产生不同的结果?

Mary-Kate Olsen
Mary-Kate Olsen原创
2024-11-16 00:58:03245浏览

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