问题描述
我正在尝试学习负数的二进制表示形式。我试图以二进制形式输出12和〜12。
print(~12)
输出:
-13
这是12的1的补码。
但是我怀疑二进制文件12是1100 和 -13(1的补码12)是0011 ,但是 3也是0011 二进制这对我来说很困惑。
-13和3如何具有相同的二进制值?
解决方法
TLDR:-13和3不具有相同的二进制值。混淆源于忽略显式符号和填充/宽度。
Python整数表现为 unsigned 任意宽度的二进制数字,带有单独符号位。没有 signed 数字的通用,明确的二进制表示形式。
例如,12是数字...1100
和符号+
,而-12是相同的数字...1100
但符号-
。值得注意的是,...
可以是任意许多前导数字-1100
,01100
,001100
等都是相同的数字。此0填充可将大小数字相同,例如至少4位12 ...1100
可以与至少5位16 ...10000
对齐。
这意味着不能有一个特定的前导符号位,因为每个位置之前都可以带有另一个0
。取而代之的是,符号位在数字的前面:0...1100
或+...1100
是12,而1...1100
或-...1100
是-12。这在将符号和绝对值分开的数字的按位规范表示中可见。
>>> bin(12)
0b1100
>>> bin(-12)
-0b1100
因此,4位按位补码12为-0011
,而3为+0011
。