混淆 1 的补码二进制表示

Confusion with 1's compliment binary representation

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

print(~12)

输出:

-13

这是 12 的 1 的补码。

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

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

TLDR:-13 和 3 的二进制值不同。混淆源于忽略显式符号和 padding/width.


Python 整数表现为 unsigned 任意宽度的二进制数,带有 separate 符号位。 有符号数字没有通用的、明确的二进制表示。

例如,12 是数字 ...1100 和符号 +,-12 是相同的数字 ...1100 但符号 -。值得注意的是,... 可以是任意多个前导数字——110001100001100 等等都是相同的数字。这个 0-padding 允许对小数和大数一视同仁,例如at-least 4 位数字 12 ...1100 可以与 at-least 5 位数字 16 ...10000.

对齐

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

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

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