所有关于电路
技术文章

二进制补码表示法:理论和例子

2017年11月16日,通过史蒂夫asrar

本文将回顾二进制补码表示的理论以及一些例子。

二进制补码表示是一个基本的技术在数字算法允许我们替换加法减法操作。

本文将首先回顾二进制补码表示的理论以及一些例子。然后,我们将简要地讨论一个加法器和减法器的框图。

二进制补码表示法是一种代表签署数字数字计算机。的主要目标是开发一种技术取代加法减法操作。通过这种方式,我们将能够使用相同的电路执行加法和减法。这将减少数量的盖茨和,因此,大小,力量,系统的成本。事实上,没有补充的概念,我们将不得不使用方法类似于纸笔处理小数时,我们使用的方法。这将需要使用两个不同的模块来执行加法和减法。此外,我们将不得不做出一些决定之前能够应用加法器、减法器的输入块(这个假设的电脑的问题,阅读2.4.1节这本书)。

背景:玩无符号数

假设我们有一个加法器将两个四位数字,$ $ = a_3a_2a_1a_0 $ $ $ $ b = b_3b_2b_1b_0 $ $,连同一个输入,$ $ c_的{}$ $,并计算出总和$ $ a + b + c_{在}$ $。我们如何使用这个加法器来执行减法,即= a - b $ $ $ $ ?添加一个常数,如$ $ $ $,$ $ $ $,,然后,减去相同的常数S $ $ $ $不会改变结果:

$ $ S = a + M-b-M $ $

方程1

一个足够大的$ $ $ $,我们有

$ $ $ $ B = m B > 0

方程2

和方程1可以写成

$ $ S = a + b m $ $

方程3

方程3需要一个加法和减法。此外,使用方程3,我们需要计算另一个减法,即B =桶美元美元。似乎我们使事情比以前更复杂,因为S = a - b美元只需要一美元3需要一个加法和减法但方程2倍!然而,我们需要注意方程所需的2倍3有一个共同点:这两个减法包括常见的操作数,$ $ $ $。这导致我们的想法,也许我们可以找到合适的$ $ M $ $允许我们简化方程2和3的减法。如果可能的话,这将允许我们使用方程3 -取代加法减法。所以问题是:什么是合适的值不变,$ $ $ $ ?在下面几节中我们将看到,美元美元= 2 ^ {k} $ $是适当的值k位号码。

假设$ $ $ $ b是一个四位数字和检查减法桶美元美元。我们可以使用$ $ 10000 M = _ ={(2)} _{(10)} $ $ 16来简化减法。这种简化是可能的,因为我们可以编写M = (M - 1) + 1和获得

$ $ B = 10000 _ {(2)} - B = (01111 _ {(2)} - B) + 00001 _ {(2)} $ $

我们可以很容易地计算$ $ 01111 _ {(2)}- b $ $,因为它是,事实上,b的逐位补$ $ $ $。例如,如果$ $ b = 0011 _{(2)} $ $,然后

$ $ B = -0011 (01111 _ {(2)} _ {(2)}) + 00001 _ {(2)} = 01100 _ {(2)} + 01100 _ {(2)} $ $

正如您可以看到的,括号内的减法是b的逐位补$ $ $ $。因此,执行减法桶美元美元,我们只需要找到b的逐位补$ $ $ $,然后添加$ $ 00001 _{(2)}$ $的结果。在本文的后面我们将会看到,从实现的角度来看,这是一个简单的任务添加$ $ 00001 _{(2)}$ $的逐位补数。

$ $ $ $,我们可以使用一个加法器来计算一个B + $ $ $ $方程3。到目前为止,我们已经绕过使用减法器,但是为了达到最终的结果,我们需要减去M $ $ $ $ $ $ $ $ a + B。我们怎样才能完成这个?在上面的例子中,我们正在考虑四位数字,因此,S $ $ $ $的最大价值是$ $ = 1111 _ {(2)}$ $ $ $ b = 0000 _ {(2)} $ $, $ $ S = 1111 _ {(2)} = 15 _ {(10)} $ $。因此,四位充分代表a - b美元美元。选择$ $ 10000 M = _ ={(2)} _{(10)} $ $ 16,并添加$ $ $ $ $ $ a - b美元美元,我们只改变第五位的a - b美元美元地位。我们可以使用这个观察减去M $ $ $ $ $ $ + $ $ B方程3。换句话说,执行减法方程3,我们只需要丢弃的一些排名靠前,位于第五。这是,事实上,相当于执行模m计算这意味着我们限制计算结果小于或等于m - 1美元美元。

上面的讨论总结如下:如果$ $ $ $ $ $ $ $ b是两位数字,计算减法a - b美元美元可以通过添加$ $桶$ $ $ $ $ $,丢弃一些位置$ $ $ $ k + 1。这里$ $ $ $,称为互补常数,2 = $ $ ^ {k} $ $。

模M算术,桶美元美元作为相反的$ $ $ $ b和被称为二进制补码的$ $ $ $ b ($ $ M = 2 ^ {k} $ $)。这种相反的性质是显而易见的,因为b添加$ $ $ $ $ $桶给$ $美元美元$ = $ $ 0 $ $模M算术。基于这个想法,我们可以定义的$ $ $ $ b桶美元美元。正如上面所讨论的,我们可以计算一个数的二进制补码,首先计算它的逐位补,然后把1添加到结果。

示例1:

假设我们正在与无符号四位数字。减去$ $ b = 0110 _{(2)} = 6 _{(10)} $ $ $ $ 1011 = 11 _ _{(2)} ={(10)} $ $用二进制补码表示。

因为我们处理的是四位数字,$ $ $ $ $ $ 2 M ^ {k} = 2 ^ {4} $ $。基于上述讨论,我们可以代表$ $ - B $ $ $ $ B =桶$ $。我们获得

$ $ B = (m - 1) - B + 1 = 01111 -0110 _ {(2)} _ {(2)} + 00001 _ {(2)} = 00001 _ {(2)} + 00001 _ {(2)} = 00001 _ {(2)} $ $

B现在,我们可以添加$ $ $ $ $ $ $ $使

$ $ + B = 1011 _ {(2)} + 01010 _ {(2)} = 01010 _ {(2)} $ $

丢弃的第五位,我们获得

$ $ a - b = 0101 _ {(2)} = 5 _ {(10)} $ $

示例2:

假设我们正在与无符号位数字。减去$ $ b = 01001 _{(2)} = 9 _{(10)} $ $ $ $ = 10111 _{(2)} = 23 _{(10)} $ $用二进制补码表示。

因为我们正在处理位数字,将M $ $ $ $ $ $ $ $ 2 ^ 5。我们可以代表$ $ - B $ $ $ $ B =桶$ $。我们获得

$ $ B = (m - 1) - B + 1 = 011111 -01001 _ {(2)} _ {(2)} + 000001 _ {(2)} = 000001 _ {(2)} + 000001 _ {(2)} = 000001 _ {(2)} $ $

B现在,我们可以添加$ $ $ $ $ $ $ $使

$ $ + B = 10111 _ {(2)} + 10111 _ {(2)} = 101110 _ {(2)} $ $

丢弃的第六位,我们获得

$ $ a - b = 01110 _ {(2)} = 14 _ {(10)} $ $

如何表示签署数字?

添加b $ $ $ $ $ $桶给$ $美元美元美元等于零模M算术。这就是为什么在模m算法,我们可以考虑桶美元美元的相反的$ $ $ $。第二列的下面的表1列出了所有可能的组合有三位。对应的十进制值给出这三位数字的第一列。假设$ $ M = 2 ^ 3 $ $,我们得到相反的十进制值在第一列在第三列。你可以很容易地验证第二和第三列中的值之和等于零模m算术。表显示一个三位数字可能有两种不同的解释。例如,$ $ $ $ 010可以被视为积极的小数$ $ 2 $ $(表格的第二列)或负十进制数6美元美元(第三列的表)。区分这两种情况下,我们可以使用一个额外的一点一点在最左边的位置。这一点,称为符号位,指定如果一个给定的数字是积极的还是消极的。

表1
b的十进制值 + b的代表 - b的代表
0 000年 000年
1 001年 111年
2 010年 110年
3 011年 101年
4 One hundred. One hundred.
5 101年 011年
6 110年 010年
7 111年 001年

当符号位为零,被解释为积极。在这种情况下,其余三位将十进制值的大小根据表的第一列。例如,$ _{(2)}$ 0010美元将被视为+ 2美元美元。符号位时,这一数字将被解释为负值,我们必须使用第三列的表。例如,$ _{(2)}$ 1010美元将被解释为6 $ $ $ $。事实上,我们使用的是四位代表一个有符号数的大小可以与三位编码。

现在,让我们包括符号位在最左边的位置上我们的三位数字和检查可能的组合。图1显示了一个四位数字的所有可能的组合。如果我们认为这些数据是无符号值,我们将获得的十进制值外圆。例如,$ _{(2)}1010美元等于十进制$ $ 10美元美元视为一个无符号数。但是,如果我们假设这四位数字作为签名值,然后,我们将获得签署了十进制值内循环。例如,$ _{(2)}$ 1101美元是一个负数,因为符号位为1。使用第三列的表或以上,同样,计算其二进制补码,我们看到美元_{(2)}$ 101美元对应的十进制$ $ 3 $ $,因此,美元1101美元_ {(2)}= 3 _ {(10)}$ $。

图1所示。四位二进制补码表示圆。

考虑图1的十进制值,我们可以验证补充概念与互补常数等于2 ^ 4 = 16 $ $ $ $。说,例如,一个负值5美元,美元由11美元,美元实际上是16:5美元美元。请注意,所有的负数的符号位。这有助于我们轻松地识别系统中的一个负数处理数字签名。

此外,图1展示了这些数字的范围,可以在签署和无符号表示。如这个图所示,口译作为无符号数,我们可以把四位代表值从$ $ 0 $ $ $ $ $ $ 15。然而,随着签署表示,我们可以使用四位代码的值从8美元美元$ $ $ $ $ $ + 7。注意不对称签署了二进制补码表示的范围。我们将在以后的文章中讨论这个不对称的二进制补码表示会导致溢出和程序员需要谨慎,以避免可能的错误产生的这种行为。

总结本节中,当我们假设一个签署了两项补充表示,我们应该首先考虑符号位。如果符号位为零,我们可以找到对应的十进制值与无符号数。然而,当符号位是1,对应的十进制值是两个相反的补的数量。

示例3:

假设一个签署了两项补充表示,找到相对应的十进制值$ $ = 01110 _ {(2)}$ $ $ $ b = 10110 _ {(2)} $ $。

因为$ $ $ $是正的,相应的十进制数将$ $ = 2 ^ 3 + 2 ^ 2 + 2 ^ 1 = 14 $ $。然而,$ $ $ $ b是一个负数,因此

$ $ = - b (2 \;补充\;\;b) = - (01001 _ {(2)} + 01001 _ {(2)}) = - (01010 _ {(2)}) = -10 _ {(10)} $ $

现在我们熟悉签署了二进制补码表示的概念,我们可以更容易地执行添加或者删除工作。

示例4:

假设我们正在与位数字签名。减去$ $ b = 00101 _{(2)}从$ $ $ $ = 01001 _{(2)}$ $用二进制补码表示。

两个$ $ $ $ $ $ $ $ b是积极的和我们有$ $ = 9 _ {(10)}$ $ $ $ b = 5 _ {(10)} $ $。计算a - b美元美元,我们需要找到- b美元美元并将它添加到$ $ $ $。我们获得

$ $ - b = \;两个\;补充\;\;b = 11010 _ {(2)} + 00001 _ {(2)} = 00001 _ {(2)} $ $

然后,我们得到

$ $ + (- b) = 01001 _ {(2)} + 01001 _ {(2)} = 100100 _ {(2)} $ $

因为我们正在与位的数字,我们应该抛弃的第六位结果。因此,我们有

$ $ a - b = 00100 _ {(2)} = 4 _ {(10)} $ $

考虑到十进制值,我们可以验证结果是正确的。

例5:

假设我们正在与位数字签名。减去$ $ b = 00110 _{(2)}从$ $ $ $ = 10111 _{(2)}$ $用二进制补码表示。

我们正在处理数字签署以来,积极的和等于b $ $ $ $ $ $ 6 _ {(10)} $ $。然而,$ $ $ $是负数,因此

$ $ = -(两个\;补充\;\;一)= (01000 _ {(2)}+ 01000 _ {(2)})= - (01001 _ {(2)})= 9 _ {(10)}$ $

计算a - b美元美元,我们需要找到- b美元美元并将它添加到$ $ $ $。我们获得

$ $ - b = \;两个\;补充\;\;b = 11001 _ {(2)} + 00001 _ {(2)} = 00001 _ {(2)} $ $

然后,我们有

$ $ + (- b) = 10111 _ {(2)} + 10111 _ {(2)} = 110001 _ {(2)} $ $

我们正在与位数字,所以我们应该丢弃的第六位的结果。因此,我们获得

$ $ a - b = 10001 _ {(2)} $ $

我们可以找到这个负数的十进制数

$ $ a - b = - (01111 _ {(2)}) = -15 _ {(10)} $ $

在这两个例子中,我们丢弃的第六位,但结果是正确的,因为二进制补码表示是基于模运算。

例6:

假设我们正在与位数字签名。减去$ $ b = 01001 _{(2)}从$ $ $ $ = 10111 _{(2)}$ $用二进制补码表示。

我们正在处理数字签署以来,积极的和等于b $ $ $ $ $ $ 9 _ {(10)} $ $。然而,$ $ $ $是负数,因此

$ $ = -(两个\;补充\;\;一)= (01000 _ {(2)}+ 01000 _ {(2)})= - (01001 _ {(2)})= 9 _ {(10)}$ $

计算a - b美元美元,我们需要找到- b美元美元并将它添加到$ $ $ $。我们获得

$ $ - b =两人\;补充\;\;b = 10110 _ {(2)} + 00001 _ {(2)} = 00001 _ {(2)} $ $

然后,我们有

$ $ + (- b) = 10111 _ {(2)} + 10111 _ {(2)} = 101110 _ {(2)} $ $

我们正在与位数字,所以我们应该丢弃的第六位的结果。因此,我们获得

$ $ a - b = 01110 _ {(2)} = 14 _ {(10)} $ $

虽然我们预期结果$ $ a - b = 9 _{(10)} 9 _{(10)} = -18 _{(10)} $ $,我们计算了一个正数。这是由于这样的事实:最大的正数,可以用5位表示$ $ 01111 _ {(2)}= 15 _ {(10)}$ $。这个例子表明,我们总是要检查的结果计算确保溢出并没有发生,结果是有效的。溢出发生如果两个正数加在一起,结果是负数,或者两个负数是加在一起,结果是积极的。用二进制补码表示形式,不可能有溢出如果正面和一个负数是加在一起。读到一个简单的溢出检测方法,见2.4.2节这本书

一个简单的加法器、减法器的框图

本文开始提到的,二进制补码表示的主要目标是开发一种技术,允许我们使用单一执行两个加法和减法操作电路。为此,我们需要一个需要两个二进制数的加法器,$ $ $ $ $ $ $ $ b,连同一个输入,$ $ c_的{}$ $,并计算出总和$ $ a + b + c_{在}$ $。图2显示了两个补数的框图基础加法器、减法器。在这个图中,$ $子/ \眉题{添加}$ $是零,“选择性组件”适用于y $ $ $ $ $ $ b输入加法器和$ $ $ $ c_{在}$ $ 0。因此,加法器的输出将$ $ a + b + c_ {} = x + y $ $。然而,当$ $子/ \眉题{添加}= 1美元,美元的“选择性组件”应用位补y, y ^ $ ${惠}$ $在图中,$ $ $ $ b输入加法器。此外,在这种情况下,$ $ c_{在}$ $将一个。因此,加法器将计算$ $ a + b + c_ {} = x + y(^{惠}+ 1)$ $。如前所述在前面的部分中,术语$ $ y ^{惠}+ 1 $ $ = $ $ y的二进制补码$ $。因此,加法器的输出会计算x - y美元美元。

图2。一个加法器和减法器的框图。图片由计算机算法:算法和硬件设计

总结

  • 如果$ $ $ $ $ $ $ $ b有两位无符号数,计算减法a - b美元美元可以通过添加$ $桶$ $ $ $ $ $,丢弃一些位置$ $ $ $ k + 1。这里$ $ $ $,称为互补常数,等于2 ^ k美元美元。
  • 模M算术,桶美元美元作为相反的$ $ $ $ b和被称为二进制补码的$ $ $ $ b ($ $ M = 2 ^ {k} $ $)。
  • 我们可以计算一个数的二进制补码,首先计算它的逐位补,然后把1添加到结果。
  • 当我们假设一个签署了两项补充表示,我们应该首先考虑符号位。如果符号位为零,我们可以找到对应的十进制值与无符号数。然而,当符号位是1,对应的十进制值是两个相反的补的数量。
  • 我们总是要检查的结果计算确保溢出并没有发生,结果是有效的。溢出发生如果两个正数加在一起,结果是负数,或者两个负数是加在一起,结果是积极的。

看到我DSP-related文章AAC格式的完整列表,请参阅这个页面

1评论