我试图学习负数的二进制表示。我试图以二进制输出 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...1100or+...1100为 12,1...1100or-...1100为 -12。这在分隔符号和绝对值的数字的规范按位表示中是可见的。
>>> bin(12)
0b1100
>>> bin(-12)
-0b1100
因此,12 的 4 位按位补码是-0011,而 3 是+0011。