首页 >后端开发 >Golang >为什么 fmt.Printf 在 Go 中显示有符号整数的二进制表示不正确?

为什么 fmt.Printf 在 Go 中显示有符号整数的二进制表示不正确?

Susan Sarandon
Susan Sarandon原创
2024-11-03 11:29:29295浏览

Why Does fmt.Printf Display Incorrect Binary Representations for Signed Integers in Go?

二进制补码和 fmt.Printf

原始问题:

当尝试打印二进制表示时有符号整数,fmt.Printf 生成与预期的二进制补码值不同的输出。

分析:

二进制补码是计算机在内部表示有符号的技术整数。例如,-5 将表示为 1111 1011。但是,当 fmt.Printf 与有符号整数一起使用时,会产生意外结果。然而,转换为无符号整数会产生正确的二进制表示形式。

解释:

观察到的行为不是由于整数的内部表示造成的。相反,它是 fmt.Printf 如何格式化二进制数的结果。

fmt.Printf 使用的 fmt.integer 函数在格式化之前将负符号整数转换为正值。这会导致绝对值的二进制值前面带有 - 符号。

示例:

<code class="go">var i int8 = -5
fmt.Printf("%b", i) // Outputs: -101 (Incorrect)</code>

在此示例中,-5 转换为 5二进制形式,然后在前面加上 .,结果为 -101。

解决方案:

要获得有符号整数的正确二进制表示,可以将将其转换为无符号整数,然后使用 fmt.Printf 打印二进制表示。

<code class="go">var i int8 = -5
var u uint8 = uint8(i)
fmt.Printf("%b", u) // Outputs: 1111 1011 (Correct)</code>

以上是为什么 fmt.Printf 在 Go 中显示有符号整数的二进制表示不正确?的详细内容。更多信息请关注PHP中文网其他相关文章!

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