Golang:二进制补码和fmt.Printf

因此,计算机使用二进制补码在内部表示有符号整数。即,-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 -

有人可以澄清吗?

回答:

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

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

   165      negative := signedness == signed && a < 0

166 if negative {

167 a = -a

168 }

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

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

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

以上是 Golang:二进制补码和fmt.Printf 的全部内容, 来源链接: utcz.com/qa/420752.html

回到顶部