我试图学习负数的二进制表示。我试图以二进制输出 12 和 ~12 。
print(~12)
输出:
-13
这是 12 的 1 的补码。
但我怀疑二进制12是1100,-13(12的1的补码)是0011,但3也是二进制的0011。这让我很困惑。
-13 和 3 如何具有相同的二进制值?
我试图学习负数的二进制表示。我试图以二进制输出 12 和 ~12 。
print(~12)
输出:
-13
这是 12 的 1 的补码。
但我怀疑二进制12是1100,-13(12的1的补码)是0011,但3也是二进制的0011。这让我很困惑。
-13 和 3 如何具有相同的二进制值?
TLDR:-13 和 3 的二进制值不同。混淆源于忽略显式符号和填充/宽度。
Python 整数表现为无符号任意宽度的二进制数,具有单独的符号位。有符号数没有通用的、明确的二进制表示。
例如,12 是数字...1100
和符号+
,-12 是相同的数字...1100
但符号-
。值得注意的是,...
可能是任意多个前导数字 - 1100
、01100
等001100
都是相同的数字。这种 0 填充允许同等对待小数和大数,例如,至少 4 位数字 12...1100
可以与至少 5 位数字 16 对齐...10000
。
这意味着不能有特定的前导符号位,因为每个位置都可以在另一个位置之前0
。相反,符号位任意位于数字之前:0...1100
or+...1100
为 12,1...1100
or-...1100
为 -12。这在分隔符号和绝对值的数字的规范按位表示中是可见的。
>>> bin(12)
0b1100
>>> bin(-12)
-0b1100
因此,12 的 4 位按位补码是-0011
,而 3 是+0011
。