原始问题:
当尝试打印二进制表示时有符号整数,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中文网其他相关文章!