【发布时间】:2016-10-01 15:23:33
【问题描述】:
因此计算机使用二进制补码在内部表示有符号整数。即,-5 表示为 ^5 + 1 = "1111 1011"。
但是,尝试打印二进制表示,例如以下代码:
var i int8 = -5
fmt.Printf("%b", i)
输出-101。不完全是我所期望的。是格式不同还是根本不使用二进制补码?
有趣的是,转换为 unsigned int 会产生“正确”的位模式:
var u uint8 = uint(i)
fmt.Printf("%b", u)
输出是 11111011 - 正好是 -5 的 2s 补码。
所以在我看来,这个值实际上是在内部使用二进制补码,但格式是打印无符号 5 并在前面加上 -。
有人可以澄清一下吗?
【问题讨论】:
-
我不知道为什么有人认为这很“奇怪”。无论您使用什么基数,负数仍然是负数。如果您要求以 8、12 或 16 为基数,我希望得到同样的结果。
-
好吧,我没说奇怪。我只是想了解 2s 的补码,结果出乎我的意料。
-
我不认为你真的希望通过玩用高级语言编写的数字格式化函数来理解 2 的补码。
-
你有什么建议?
标签: go