1的补码表示法和2的补码表示法之间的区别

28 Aug 2024 | 5 分钟阅读

要理解1的补码和2的补码,我们应该先了解补码。

补码

为了进行逻辑运算和简化减法操作,数字系统通常使用补码。二进制数系统包含两种补码,即1的补码和2的补码。现在我们将分别描述每种补码。之后,我们将描述它们之间的区别。

1's 补码

通过一个简单的算法,就可以轻松地将二进制数转换为1的补码。根据这个算法,如果我们翻转(或称反转)一个二进制数的所有位,生成的二进制数将成为该二进制数的1的补码。这意味着在1的补码中,我们需要将1转换为0,将0转换为1。N'用于表示一个数的1的补码。

示例:这里,我们假设数字是用4位存储的。

还有另一种找到数字1的补码的方法。我们可以使用一个公式来找到它,描述如下:

N' = (2n - 1) - N

其中

N' 用于在1的补码表示法中表示-N

N 用于表示正整数

n 用于表示每字(word)的位数

例如

假设我们有一个8位字,N = 6。现在N的1的补码描述如下:

N' = (28 - 1) - 6
    = 249
    = (11111001)2

通过这个公式,我们可以将给定的数字转换为1的补码。

2's 补码

通过一个非常简单的算法,也可以轻松地将二进制数转换为2的补码。根据这个算法,我们可以通过先反转给定的二进制数来得到它的2的补码。之后,我们必须在最低有效位(LSB)上加1。这意味着我们必须先对一个数执行1的补码运算,然后将1加到该数上才能得到2的补码。N*用于表示一个数的2的补码。

示例:这里,我们假设数字是用4位存储的。

还有另一种找到数字2的补码的方法。我们可以使用一个公式来找到它,描述如下:

N* = 2n - N

其中

N* 用于在1的补码表示法中表示-N (原文此处有误,应为2的补码表示法)

N 用于表示正整数

n 用于表示每字(word)的位数

例如

假设我们有一个8位字,N = 6。现在N的1的补码描述如下:

N* = 28 - 6
     = 250
     = (11111010)2

通过这个公式,我们可以将给定的数字转换为2的补码。

1的补码和2的补码之间的区别

1的补码和2的补码之间存在多种差异。我们将通过不同参数来描述它们,如下所示:

参数1的补码表示法2的补码表示法
生成过程通过翻转(或反转)给定二进制数的所有位,我们可以得到其1的补码。通过先对给定二进制数进行1的补码运算,然后将1加到该数上,可以得到其2的补码。
示例二进制数9(1001)的1的补码是6(0110)。二进制数9(1001)的2的补码可以通过对其进行1的补码运算得到,即6(0110),然后再加1,得到7(0111)。所以9(1001)的2的补码是7(0111)。
使用的逻辑门1的补码的实现非常简单。对于每个输入位,它基本上使用非门(NOT gate)。对于每个输入位,2的补码基本上使用非门(NOT gate)和一个全加器(full adder)。
数字表示如果我们想表示带符号的二进制数,我们可以使用1的补码。如果有一个数字0,那么它将无法以模糊表示的形式使用。如果我们想表示带符号的二进制数,我们也可以使用2的补码。如果有一个数字0,那么它就可以作为所有给定数字的无歧义表示。 (原文此处有误,应为“无歧义表示”) (原文此处有误,应为“无歧义表示”) (原文此处有误,应为“无歧义表示”)
K位寄存器如果有一个k位寄存器,1的补码将使用-(2(k-1) -1)来存储最小负数,以及(2(k-1) -1)来存储最大正数。如果有一个k位寄存器,2的补码将使用-(2(k-1))来存储最小负数,以及(2(k-1) -1)来存储最大正数。
0的表示在1的补码中,有两种表示数字0的方法,即+0和-0。在8位寄存器中,+0表示为00000000(正零),而-0表示为11111111(负零)。在2的补码中,数字0只有一种表示方式,无论是+0还是-0。无论是负零还是正零,都可以表示为0000000(+0)。因为如果我们在11111111(-1)上加1,我们会得到00000000(+0),这与正零相同。这就是为什么数字0在2的补码中总是被视为正数。这也是为什么我们通常使用2的补码。
符号扩展在1的补码中,符号扩展用于将给定的符号转换为任何有符号整数的其他符号。2的补码中的符号扩展与1的补码中的符号扩展的工作方式相同。在这里,它也用于将给定的符号转换为任何有符号整数的其他符号。
循环进位(End-Around Carry-Bit)如果我们使用1的补码进行算术运算(加法),在这种情况下,我们将首先进行二进制加法。之后,我们将添加循环进位位。如果我们使用2的补码进行算术运算(加法),在这种情况下,将不会发生循环进位位的加法,因为2的补码对于零只有一个值。2的补码会忽略这种加法。
操作的便捷性1的补码总是需要添加循环进位位。因此,与2的补码算术运算相比,1的补码算术运算更难。2的补码不需要添加循环进位位。因此,与1的补码算术运算相比,2的补码算术运算更容易。