漫谈计算机组成原理(九·续)定点数的运算方法

本文讲什么?

在上一篇文章中,我们主要讲述了定点数的加、减、乘运算,唯独没有讲解除法运算。原因有两个,一来上一篇文章的内容确实比较多,二来除法运算比乘法相对复杂。
所以,本文将从除法的来历讲起,然后讲除法运算的几种方法。

除法运算的形成

我们来看这样一个例子:在8位寄存器中存储了00000111,4位寄存器中存储了0010,计算00000111/0010。
回想一下,我们整数的除法是怎么做的?如上面的数改写成十进制,即7/2的结果是多少呢?
我们肯定是先列出一个除法式子,像下面这样。

我们首先是判断一下,当前被除数7中有几个除数,有几个则商就上几个,然后被除数减去除数乘商得到余数,接着判断余数中有几个除数,直到除不开为止。如果发现商是0,则被除数补0,除数向右移动一位,继续计算。
在7中有3个2,结果是余1,1中不存在2,这就是最终的结果。
接着看一下上面的例子:我们要做的,肯定是先列出一个式子。

和整数除法一样,两个二进制数之间的除法同样的。步骤如下:

  • 要判断被除数中有几个除数
  • 有几个则商上几,有n个除数商就是n(二进制除法中,结果不是1就是0)
  • 被除数-n*除数 = 被除数’
  • 除数向右移动一位
  • 继续上述过程,得到最终结果

大体上的过程就是这样的。根据上述的过程,我们能够很容易的设计出基本的除法器。此外,要注意的是,除法器应该具有判断除数或者被除数是否为0的功能,因为被除数为0时结果为0,没有意义;而除数为0时,结果为无穷大,无法表示。

计算机定点数除法运算的几种方法

在了解了除法器的基本情况后,我们就来讲除法运算的两种方法。分别是:恢复余数法、加减交替法。

恢复余数法

从名字中可以看出,这种方法对余数做了某种恢复。为什么会出现这种恢复呢?原因很简单,我们在分析一般除法的过程中可以看到,如果除数和被除数当前对齐的位上,被除数有0个除数,此时我们就需要将被除数补0。但是计算机并不知道被除数是否够除除数(因为不管除数和被除数的情况如何,最后的商上的位,不是0就是1),就需要先用被除数减去除数,如果发现余数是小于0的,那么计算机就知道了此时对齐的位无法得到最终的结果,则将被除数向又移动一位。这就是恢复余数法的核心思想。当然,我们在直接计算的时候,需要将两个数的绝对值相除,再得到最终的结果。
接下来我们就来看,恢复余数法究竟是如何运算的。

  • 例子:x=-0.1011,y=-0.1101,求[x/y]
    因为需要使用两个数的绝对值运算,所以我们先得到两个数的绝对值。
    [x]=1.1011,[x*]=0.1011;[y]=1.1101,[y*]=0.1101。
    还有,在运算时,因为涉及到两个数的减法,所以我们需要得到[-y*]
    [-y*]=1.0011.计算过程如下表。


    初始化的时候,被除数放到被除数的位置,而商为0.先减去除数,如果余数为正,则商上1,否则上0,接着将被除数加上除数。无论哪种情况,都需要将被除数向左移动一位。这就是恢复余数法的过程。最终,别忘了使用异或操作得到符号位,才能得到最终结果。

加减交替法

加减交替法也称作不恢复余数法。为啥呢,因为在加减交替法中,先让被除数减除数,如果结果为正,则上1,;如果结果为负,则加上除数。接着将被除数向做移动一位。不过你要是细看的话,这两种方法其实并没有太大的区别,自己好好体会一下就行了。
下面看个例子:

  • 例子:x=0.1011,y=0.1101,求[x/y]
    [x]=1.1011,x*=0.1011;[y]=0.1101,y*=0.1101,[-y*] = 1.0011。
    计算过程如下:

结语

本节是承接定点数的计算方法的,下一节,我们将开始计算机的运算方法后半部分的内容,即浮点数的计算过程,内容并不多,所以会放到一篇文章中。
如果你喜欢我的文章,欢迎关注我的微信公众号:最高权限比特流

参考:《计算机组成原理》唐朔飞

发表评论

电子邮件地址不会被公开。 必填项已用*标注