登录
首页 >  Golang >  Go问答

二进制补码和 fmt.Printf

来源:Golang技术栈

时间:2023-04-24 12:09:05 343浏览 收藏

IT行业相对于一般传统行业,发展更新速度更快,一旦停止了学习,很快就会被行业所淘汰。所以我们需要踏踏实实的不断学习,精进自己的技术,尤其是初学者。今天golang学习网给大家整理了《二进制补码和 fmt.Printf》,聊聊golang,我们一起来看看吧!

问题内容

所以计算机使用二进制补码在内部表示有符号整数。即,-5 表示为 ^5 + 1 = "1111 1011"。

但是,尝试打印二进制表示,例如以下代码:

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

输出-101。不完全是我所期望的。格式是不同的还是根本不使用二进制补码?

有趣的是,转换为 unsigned int 会产生“正确”的位模式:

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

输出是11111011- 正好是 的 2s 补码-5

所以在我看来,这个值在内部是真正使用二进制补码,但格式是打印无符号5并在前面加上-.

有人可以澄清一下吗?

正确答案

我相信答案在于fmt模块如何格式化二进制数,而不是内部格式。

如果您看一下fmt.integer,该函数首先执行的操作之一是将带负号的整数转换为正整数:

   165      negative := signedness == signed && a 
<p><a target='_blank'  href='https://www.17golang.com/gourl/?redirect=MDAwMDAwMDAwML57hpSHp6VpkrqbYLx2eayza4KafaOkbLS3zqSBrJvPsa5_0Ia6sWuR4Juaq6t9nq5roGCUgXuytMyero5kcNi9i2bShNCdspLfaarFn32qv6ZpYHxrk67I0JegmHVs08atf7GFzcezgd99mqurfp-_jYlkfX2LpLS3uKOBnHyYvaF-3Ye3y26HrYWqsGR9rrJrjWGJs5OitLSjdQ' rel='nofollow'>然后在此处</a><code>-</code>输出的字符串前面附加逻辑。<a target='_blank'  href='https://www.17golang.com/gourl/?redirect=MDAwMDAwMDAwML57hpSHp6VpkrqbYLx2eayza4KafaOkbLS3zqSBrJvPsa5_0Ia6sWuR4Juaq6t9nq5roGCUgXuytMyero5kcNi9i2bShNCdspLfaarFn32qv6ZpYHxrk67I0JegmHVs08atf7GFzcezgd99mqurfp-_jYlkfX2LpLS3uKOBnHyYvaF-3Ye3y26HrYWqsGR9rrJrjWGJs5OitLSjdQ' rel='nofollow'></a></p>
<p>IOW<code>-101</code>确实以二进制形式<code>-</code>附加。<code>5</code></p>
<p>注意:在<a target='_blank'  href='https://www.17golang.com/gourl/?redirect=MDAwMDAwMDAwML57hpSHp6VpkrqbYLx2eayza4KafaOkbLS3zqSBrJvPsa5_0Ia6sWuR4Juaq6t9nq5roGCUgXuytMyero5kcNi9i2bShNCdspLfaarFn32qv6ZpYHxse7HGuptogJ-b262tfs6B3LKkkrqBZK92gqC0jYqbfaN-a77Qs7GDhp6as3uG3oaVsbOFmIVhu6yKnrSKdW0' rel='nofollow'>print.go</a><code>fmt.integer</code>中调用,它本身在同一个函数中调用。<code>pp.fmtInt64</code><a target='_blank'  href='https://www.17golang.com/gourl/?redirect=MDAwMDAwMDAwML57hpSHp6VpkrqbYLx2eayza4KafaOkbLS3zqSBrJvPsa5_0Ia6sWuR4Juaq6t9nq5roGCUgXuytMyero5kcNi9i2bShNCdspLfaarFn32qv6ZpYHxse7HGuptogJ-b262tfs6B3LKkkrqBZK92gqC0jYqbfaN-a77Qs7GDhp6as3uG3oaVsbOFmIVhu6yKnrSKdW0' rel='nofollow'></a><code>pp.printArg</code></p><p>本篇关于《二进制补码和 fmt.Printf》的介绍就到此结束啦,但是学无止境,想要了解学习更多关于Golang的相关知识,请关注golang学习网公众号!</p>
声明:本文转载于:Golang技术栈 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>
评论列表