首页 > 后端开发 > Golang > 为什么 Go 和 C 中 -1 的 `%x` 格式不同?

为什么 Go 和 C 中 -1 的 `%x` 格式不同?

Patricia Arquette
发布: 2024-11-29 21:22:11
原创
902 人浏览过

Why Does `%x` Format Differ for -1 in Go and C?

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

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板