1

我试图学习负数的二进制表示。我试图以二进制输出 12 和 ~12 。

print(~12)

输出:

-13

这是 12 的 1 的补码。

但我怀疑二进制12是1100-13(12的1的补码)是0011,但3也是二进制的0011。这让我很困惑。

-13 和 3 如何具有相同的二进制值?

4

1 回答 1

2

TLDR:-13 和 3 的二进制值不同。混淆源于忽略显式符号和填充/宽度。


Python 整数表现为无符号任意宽度的二进制数,具有单独的符号位。有符号数没有通用的、明确的二进制表示。

例如,12 是数字...1100和符号+,-12 是相同的数字...1100但符号-。值得注意的是,...可能是任意多个前导数字 - 110001100001100都是相同的数字。这种 0 填充允许同等对待小数和大数,例如,至少 4 位数字 12...1100可以与至少 5 位数字 16 对齐...10000

这意味着不能有特定的前导符号位,因为每个位置都可以在另一个位置之前0。相反,符号位任意位于数字之前:0...1100or+...1100为 12,1...1100or-...1100为 -12。这在分隔符号和绝对值的数字的规范按位表示中是可见的。

>>> bin(12)
0b1100
>>> bin(-12)
-0b1100

因此,12 的 4 位按位补码是-0011,而 3 是+0011

于 2020-09-14T15:10:35.827 回答