首页 >后端开发 >Golang >为什么 fmt.Printf 显示负整数的二进制表示与 Go 中预期的不同?

为什么 fmt.Printf 显示负整数的二进制表示与 Go 中预期的不同?

Mary-Kate Olsen
Mary-Kate Olsen原创
2024-11-02 16:11:02312浏览

Why does fmt.Printf show a different binary representation for negative integers than expected in Go?

二进制补码和 fmt.Printf:解开二进制表示之谜

使用有符号整数时,计算机使用二进制补码来表示负值。这与典型的二进制表示不同,其中符号由单独的位指示。例如,在二进制补码中,整数 -5 表示为 1111 1011。

但是,使用 fmt.Printf 打印二进制表示可能会产生意外结果。例如,以下代码片段:

var i int8 = -5
fmt.Printf("%b", i)

令人惊讶地输出 -101 而不是 1111 1011。这种差异导致了一个问题:二进制补码是否真正用于内部表示,或者格式是否模糊正确的表示。

为了阐明这个问题,我们需要深入研究 fmt.Printf 如何格式化二进制数。罪魁祸首在于 fmt.integer 函数,该函数自动将负符号整数转换为正整数。此转换涉及对整数取反并在输出字符串前面添加一个 - 符号。因此,-101 输出是附加到 5 的二进制表示形式之后的 - 表示形式。

为了进一步演示这一点,将有符号整数转换为无符号整数,然后使用 fmt.Printf 对其进行格式化,生成正确的 Two's补码表示:

var u uint8 = uint(i)
fmt.Printf("%b", u)

输出 11111011,恰好是 -5 的补码。

因此,Go 中带符号整数的内部表示遵循补码约定。格式化有符号整数时看似不正确的二进制表示是由 fmt.integer 执行的自动转换和符号前置造成的。在 Go 中使用有符号整数和二进制表示时,理解这种行为至关重要。

以上是为什么 fmt.Printf 显示负整数的二进制表示与 Go 中预期的不同?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn