2's 补码相对于1's 补码的优势是什么?

73
2的补码在二进制数系统中负数表示中相对于1的补码有什么优势?它如何影响在二进制系统中以某一位表示的数值范围?

4
我认为这篇维基百科文章应该足以回答这个问题:http://en.wikipedia.org/wiki/Signed_number_representations - JYelton
3
这不是一个优势问题。在二进制补码中,第一步是进行一的补码操作。之后加上1以消除正零和负零的存在。(你必须消除一位,因为你“购买”了一位来表示符号--这将消除在你使用的位宽中的两个值。) - jinzai
6个回答

80

二进制补码相对于反码的主要优势在于只有一个零值。反码有“正”零和“负”零。

接下来,使用反码进行数字加法需要先进行二进制加法,然后再添加一个回环进位值。

二进制补码只有一个零值,并且不需要进位值。

还询问了存储值的范围如何受到影响。考虑一个八位整数值,以下是最小和最大值:

Notation     Min   Max
==========  ====  ====
Unsigned:      0   255
One's Comp: -127  +127
Two's Comp: -128  +127

参考文献:


4
概括来说:对于N位表示,取反码可以表示范围在−(2^(N−1)−1)到2^(N−1)−1内的整数,而补码可以表示范围在−2^(N−1)到2^(N−1)−1内的整数。 - Prince

25

主要的优点是:

  1. 在1's补码中,有一个-011111111)和一个+000000000),即同一0的两个值。另一方面,在2's补码中,只有一个0的值(00000000)。这是因为

    +0 --> 00000000
    

     -0 --> 00000000 --> 11111111 + 1 --> 00000000
    
  2. 在使用1进行加法或减法等算术运算时,我们必须添加一个额外的进位位,即结果中要加上1才能得到正确答案,例如:

           +1(00000001)
         +
           -1(11111110)
         -----------------
         = (11111111)
    
    但正确答案是0。为了得到0,我们必须将一个进位比特1加到结果中(11111111 + 1 = 00000000)。
    在二进制补码中,结果不需要被修改:
                   +1(00000001)
                  +
                   -1(11111111)
             -----------------
                  = 1 00000000
    

7
负整数: 2的补码适用于负整数。1的补码只是一种计算技术,可能有助于评估2的补码。真正(被击败的)与2的补码竞争的是符号-幅值表示法,用于表示负整数。
无溢出: 对于负整数来说,1的补码没有特殊用途。 2的补码很有意义,因为它可以在自然加减算术中使用,而不需要改变位。 假设没有溢出,结果的符号位就是正确的值。 这种表示法中的位数提升是直截了当的,例如,要将8位有符号整数提升为16位,我们可以简单地在其高字节中重复整数值的符号位。
符号幅值: 相反,符号-幅值表示法仅仅是人类用来表示负整数的方式。在这种表示法中,位数提升和加减算术有点混乱。

3

二进制补码的优势 #1

在二进制补码表示中,零值是由所有位都设为零而唯一表示的:

**

二进制补码的优势 #2

** 当你在二进制补码表示中对两个带符号整数执行算术运算(例如加法、减法、乘法、除法)时,你可以完全使用与两个无符号整数相同的方法(也就是没有符号位的非负整数)... 除了,你要抛弃最高位进位(或借位,对于减法)

二进制补码的优势 #3

这种二进制补码表示的属性是如此方便,以至于今天几乎每台通用计算机都使用二进制补码。 为什么?因为使用二进制补码,我们不需要针对涉及负值的算术运算使用特殊算法(因此也不需要额外的电路)。


2
两个补码相比带符号位表示法的另一个主要优点是,两个补码表示法易于在硬件中操作。

这不是鸡生蛋的问题吗?因为硬件会优化选择的任何一个... - Pacerier
1
@Pacerier,不是这样的。无论硬件选择哪一个进行优化都没有关系。问题在于,构建用于优化1's补码数字加法和减法所需的电路(逻辑门系统连接在一起)比构建用于优化2's补码数字加法和减法所需的电路更加复杂。 - user904542
1
@user904542,您是指所有的电子硬件吗?嗯,那新型生物计算机呢? - Pacerier

1

二进制补码并不是用于表示负数而是一种逆运算。

这意味着您可以执行A + B'(其中B'是B的二进制补码)以得到A - B,这意味着您可以使用加法器来完成所有操作,而无需使用减法器。


你的意思是负数不是由二进制补码表示,而是二进制补码表示负数吗? - pranphy
不,2的补码是* -1的十进制等价物。负数的2的补码是正数,最高有效位为零。 - Tony Hopkinson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接