Golang:二进制补码和fmt.Printf
因此,计算机使用二进制补码在内部表示有符号整数。即,-5表示为^ 5 +1 =“ 1111 1011”。
但是,尝试打印二进制表示形式,例如以下代码:
var i int8 = -5fmt.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.integer
是pp.fmtInt64
在print.go中调用的,本身是pp.printArg
在同一函数中调用的。
以上是 Golang:二进制补码和fmt.Printf 的全部内容, 来源链接: utcz.com/qa/420752.html