Go 和 C 中的十六进制格式冲突:了解有符号整数与无符号整数
在编程世界中,整数值的格式可以有时会带来惊喜。在 Go 和 C 中将 64 位整数打印为十六进制偏差时,就会出现这样的一个实例。
问题
如示例所示,在上使用 %x 格式说明符Go 中的整数值 -1 结果为“-1”,而在 C 中,预期输出为“ffffffffffffffff”。这种差异源于 Go 和 C 处理有符号和无符号整数的根本差异。
Go 的方法
Go 严格遵守类型安全。当格式化整数值时,它默认将其表示为有符号整数,即使输入值是大无符号整数的负表示。 Go 中的 %x 格式说明符格式化数值而不是其内存表示。
C 的方法
相反,C 不强制执行严格的类型安全。 C 中的 %x 转换通常会格式化整数值的内存表示形式,在负整数的情况下,会被解释为具有等效位的正无符号整数。
Go 中的解决方案
为了在 Go 中实现所需的行为,有必要在应用 %x 格式说明符之前显式地将有符号整数转换为无符号整数。这可以使用 uint 类型转换来完成:
fmt.Printf("%d %x %d %x", -1, -1, uint(-1), uint(-1))
输出:
-1 -1 18446744073709551615 ffffffffffffffff
Rob Pike 的推理
表示的默认行为Go 中符号形式的负数是 Rob Pike 故意选择的。他的理由是,它允许更短的负数表示,并确保所有整数格式说明符(%b、%o、%d、%x)一致地对待它们的参数。
以上是为什么 Go 和 C 中 -1 的 `%x` 格式不同?的详细内容。更多信息请关注PHP中文网其他相关文章!