因此计算机使用二进制补码来内部表示有符号整数.即,-5表示为^ 5 + 1 ="1111 1011".
但是,尝试打印二进制表示,例如以下代码:
var i int8 = -5
fmt.Printf("%b", i)
Run Code Online (Sandbox Code Playgroud)
输出-101.不是我所期待的.格式不同还是不使用Two的补码?
有趣的是,转换为unsigned int会产生"正确"的位模式:
var u uint8 = uint(i)
fmt.Printf("%b", u)
Run Code Online (Sandbox Code Playgroud)
输出是11111011- 完全是2的补码-5.
所以在我看来,值是内部真正使用二进制补码,但格式化是打印未签名5和前置a -.
有人可以澄清一下吗?
我相信答案在于fmt模块如何格式化二进制数,而不是内部格式.
如果你看一下fmt.integer,该函数的第一个动作之一是将负有符号整数转换为正整数:
165 negative := signedness == signed && a < 0
166 if negative {
167 a = -a
168 }
Run Code Online (Sandbox Code Playgroud)
然后将逻辑添加-到此处输出的字符串前面.
IOW -101真的-附加5在二进制文件中.
注:fmt.integer从所谓pp.fmtInt64的print.go,本身被称为pp.printArg在相同的功能.