做除法时,不过就是:相减、移位、相减、移位 ... 。
计算机做除法时,可以由硬件进行控制,把不够减的余数屏蔽掉。 那么,做除法时,就不必考虑 “恢复余数” 和 “不恢复余数” 了。 此法详情可见做而论道以前写的博文(点击查看)。
用加减交替法做除法,属于 “不恢复余数法”。 本来,做而论道也不打算讨论这种根本就用不着的方法了,但是,这种方法在网络上流传甚广,影响颇大。 所以,还是揭露一下吧,免得误导初学者。 话不多说,直接上图。
这张图片是某个著名考研辅导材料的视频截图。 做而论道稍微调整了一下各部分的布局,以显得紧凑一些。 如果想要查看原图,你可以点击这几个链接:点击查看、点击查看、点击查看、点击查看。 除此之外,网上还有许多的,大家就自己去搜吧。
下面,做而论道就说说这张图的诡异之处。
首先,就是字长与位数的差异。
图中已经明确给定了 “机器字长为 5 位”。那么,解题时,就必须按照 5 位来求解。
但是,图中的补码,都采用了双符号位,后面的计算过程中,都是用 6 位二进制数来讲解。
5 位的字长,能容下 6 位二进制数吗?
为什么不按照字长来解题呢? 真是很令人费解!
不按照题目给定的条件和要求来做题,考研,还有希望吗?
第二,是 “逻辑移位”。
学过《计算机组成原理》就知道,左移操作有两种:算术左移、逻辑左移。
书中,在前面讲过:算术左移适用于带符号数,逻辑左移适用于无符号数。
本题目要求用补码解题,这一定就是带符号数了,显然,应该用算术左移来移位。
如果不能用算术移位,非得用逻辑移位,那么,你总得给出一个说明吧。
总不能如此忽视前面讲过的内容吧?
难道,前面的内容,老师讲错了? 或者是你没有看见?
第三,题目要求是求:x / y。
题目给定的初始数据 ( x、y ) 都是真值,那么运算结果 ( x / y ) 也应该是真值。 而图中的计算过程都是用补码来讲解的。 最后的计算结果,也是 x / y 的补码,并不是题目要求的真值。
得出的补码,还必须换算成真值,才能满足题目的要求。
既然是考研辅导材料,严谨,还是必须的。
第四,商的末位恒置一。
本算法得出的商,实际上是商的补码。 在补码的末位恒置一,还不知道这是什么理论。
既然商的补码末位恒置 1,这也就是说:在商的末位,恒定为 1!
而实际上,x、y 的数值是多变的,x / y 的商的末位,你怎能肯定就是 1 ?
这也不好理解呀!
这也是很难让人信服的。
其实,除法并不难,小学生都是会做的,何况《计算机组成原理》还是大学生的课程!
之所以让人感到为难,是计算机专家故弄玄虚,总是用二进制小数来拨三弄四。 而实际上,计算机中,根本就没有小数点。 专家讲的这些过程以及运算结果,完全不符合计算机中的实际情况。
把这题目,稍微整理一下,就好理解了。
题目中的 x、y 都是二进制数。把具体数据代入 x / y,就是:
x / y = (+0.1000) / (-0.1011)
= (+1000 ) / (-1011) // 分子分母小数点都右移四位,值不变
在计算过程中,x 左移了四次,在右边又添了四个 0。因此,实际上参加计算的则是:
x / y = (+1000 0000) / (-0.1011)
= (+128 ) / (-11) // 换算到十进制数
现在,就是十进制的除法运算了,看起来,是不是就透亮多了?
x / y 的商数,显然就是:-11;
x / y 的余数,就应该是:+7。
又因为,x 左移四次,右边添了四个 0,这就相当于 “把小数点右移四位”。
被除数 x 如此变化,而 y 没变,那么,商和余数,也都应该 “小数点右移四位”。
再结合上图中运算结果,就都转换一下吧。
商数的补码,现在就是:10101。
换算成真值,就是:Q =-1011 =-11 (十进制)。
余数的补码,现在就是:00111。
换算成真值,就是:R = +111 = +7 (十进制)。
这就是 “以补码加减交替做除法” 的运算结果,和前面用十进制数计算的结果完全相同。
对于这个图片中的计算结果,只能说【很巧啊】!
因为算出的商,恰好是一个奇数(-11),商的末位,还真是 1 !
如果用这个算法来计算:128 / 10,商,就应该是偶数(12)了。
那么,商末位恒置一,又该怎么解释?
这个事,还是下次再说吧。
--本文完--