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

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

Susan Sarandon
发布: 2024-11-03 11:29:29
原创
298 人浏览过

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
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板