一尘不染

Golang:二进制补码和fmt.Printf

go

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

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

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

输出-101。不太符合我的期望。格式是不同的还是还是不使用二进制补码?

有趣的是,转换为无符号int会导致“正确”位模式:

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

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

因此,在我看来,值内部实际上是在使用二进制补码,但格式是打印无符号5并加a -

有人可以澄清吗?


阅读 589

收藏
2020-07-02

共1个答案

一尘不染

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

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

   165      negative := signedness == signed && a < 0
   166      if negative {
   167          a = -a
   168      }

然后,可以-此处输出的字符串前面附加逻辑。

IOW -101确实-附加到5二进制文件中。

注意:fmt.integerpp.fmtInt64print.go调用的,本身是pp.printArg在同一函数中调用的。

2020-07-02