1 1 1
----------
1 0 1
1 0 1 1 ---> additive inverse
---------
0 0 0
我喜欢lavinio的答案,但是移位操作会增加一些复杂性。通常有两种选择:在保留符号位的情况下移动位数或者不考虑符号位移动位数。这就是将数字视为带符号数(半字节为-8到7,字节为-128到127)或全范围无符号数(半字节为0到15,字节为0到255)之间的选择。
2的补码是一种聪明的负整数编码方式,大约半数的数据类型位组合被保留用于负整数,并且大多数负整数与其对应正整数相加会导致进位溢出而结果为二进制零。
因此,在2的补码中,如果一个数是0x0001,则-1是0x1111,因为这将导致组合和为0x0000(带有1的溢出)。
二进制补码是表示负数的一种方式,大多数控制器和处理器都以二进制补码形式存储负数。
二进制补码主要用于以下几个原因:
30 + 40 = 70
可以通过对 +30
和 +40
的二进制表示进行加法运算来完成。减法:40 - 30 = 10
,可以通过对 (+40) + (-30)
进行加法运算来完成,而 (-30)
的二进制表示可以通过反转 (+30)
的二进制表示的位并加上 1
来获得。 - K.N. Bhargavx = 5;
x = -5;
-
符号时,它会计算其二进制补码并存储它。1
,那么它必须是一个负数。0
,那么它是一个正数,因为在数值系统中没有-0
(1000不是-0
,而是正数8
)。0
,那么它是0
。对一个数字进行按位补码是翻转其中的所有位。要将其进行二进制补码,我们翻转所有位并加一。
对于有符号整数,使用二进制补码表示法,我们应用二进制补码运算将正数转换为其负等价物,反之亦然。因此,以半字节为例,0001
(1)变成了1111
(-1),再次应用该操作,返回到0001
。
该操作在零处的行为有利于给零提供单个表示,无需对正零和负零进行特殊处理。0000
补码为1111
,加1后溢出为0000
,给我们一个零,而不是一个正零和负零。
这种表示法的一个关键优点是,对于无符号整数的标准加法电路,在应用它们时会产生正确的结果。例如,在半字节中加1和-1:0001 + 1111
,位溢出寄存器,留下0000
。
如果您想进行初步了解,可以观看优秀的Computerphile制作的有关该主题的视频。
0
而是给出2^N
(根据定义),例如对于数字A
的 3 位,我们想要A+~A=2^N
所以010 + 110 = 1000 = 8
,这是2^3
。至少这解释了在这里“补码”一词的含义,它不仅仅是将0
和1
的含义取反。MIT 有用的视频:https://www.youtube.com/watch?v=RbJV-g9Lob8 - Charlie Parker