混淆 1 的补码二进制表示
Confusion with 1's compliment binary representation
我正在尝试学习负数的二进制表示。我试图以二进制输出 12 和 ~12。
print(~12)
输出:
-13
这是 12 的 1 的补码。
但我怀疑 二进制 12 是 1100 而 -13(12 的 1 的补码)是 0011 但 3 也是二进制的 0011。这让我很困惑。
-13 和 3 如何具有相同的二进制值?
TLDR:-13 和 3 的二进制值不同。混淆源于忽略显式符号和 padding/width.
Python 整数表现为 unsigned 任意宽度的二进制数,带有 separate 符号位。 有符号数字没有通用的、明确的二进制表示。
例如,12 是数字 ...1100
和符号 +
,-12 是相同的数字 ...1100
但符号 -
。值得注意的是,...
可以是任意多个前导数字——1100
、01100
、001100
等等都是相同的数字。这个 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
。
我正在尝试学习负数的二进制表示。我试图以二进制输出 12 和 ~12。
print(~12)
输出:
-13
这是 12 的 1 的补码。
但我怀疑 二进制 12 是 1100 而 -13(12 的 1 的补码)是 0011 但 3 也是二进制的 0011。这让我很困惑。
-13 和 3 如何具有相同的二进制值?
TLDR:-13 和 3 的二进制值不同。混淆源于忽略显式符号和 padding/width.
Python 整数表现为 unsigned 任意宽度的二进制数,带有 separate 符号位。 有符号数字没有通用的、明确的二进制表示。
例如,12 是数字 ...1100
和符号 +
,-12 是相同的数字 ...1100
但符号 -
。值得注意的是,...
可以是任意多个前导数字——1100
、01100
、001100
等等都是相同的数字。这个 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
。