因此,计算机使用二进制补码在内部表示有符号整数。即,-5表示为^ 5 +1 =“ 1111 1011”。
但是,尝试打印二进制表示形式,例如以下代码:
var i int8 = -5 fmt.Printf("%b", i)
输出-101。不太符合我的期望。格式是不同的还是还是不使用二进制补码?
-101
有趣的是,转换为无符号int会导致“正确”位模式:
var u uint8 = uint(i) fmt.Printf("%b", u)
输出是11111011-的2s补码-5。
11111011
-5
因此,在我看来,值内部实际上是在使用二进制补码,但格式是打印无符号5并加a -。
5
-
有人可以澄清吗?
我相信答案在于fmt模块如何格式化二进制数,而不是内部格式。
fmt
如果您看一看fmt.integer,该函数首先执行的操作之一就是将负有符号整数转换为正整数:
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在同一函数中调用的。
pp.fmtInt64
pp.printArg