在上篇博文中(点击查看),做而论道对 “补码加减交替做除法” 的例题,提出了一点疑问。
大家都知道,计算机中只有 1 和 0,并没有小数点。 那么,用 1、0,只能组成二进制整数。 但是,在《计算机组成原理》教材中,却经常出现诸如-0.1010 这样的数字。 这么写,完全不符合计算机中的实际情况。因为这种类型的数字,在计算机中,根本就不存在。
也有的教材上写:小数点并不是小数点,只是符号位数值位的分隔符,小数点前面的 0 就代表正号。 那么,“-0”,岂不是就有两个符号了! 这就更荒诞了。
虽然,用二进制整数可以代表人类所用的整数、小数以及浮点数,同样还有英文汉字声音图像温度压力酸碱度 ... 等等。 但是,在讲解计算机内部的计算过程时,还是应该用计算机本身的数字来说明各种问题。
计算机专家故意不用二进制整数,偏爱用二进制小数来说明这个事那个事,恐怕是为了掩盖某些他们说不清楚的问题。
还是再看看上篇博文中的插图吧,如下所示。
这张图片是某个著名考研辅导材料的视频截图,估计大家都是看过的。
图中所给定的条件是:X = +0.1000,Y = -0.1011。
图中的要求是,求两个小数的相除结果:
X / Y = (+0.1000) / (-0.1011),
其实,这算式,完全可以化为整数相除:
X / Y = (+1000) / (-1011)。
这一步转换,只不过是把分子分母同时乘以 16,即可令小数点都右移了 4 位而已。
这么简单的整数形式,计算机老师为什么不这么写呢?
也许,他们不屑于用简单的形式吧。 故弄玄虚,是不是可以显得酷一些?
另外,大家都知道,被除数的位数,应该大于除数的位数,如果是除数位数的二倍,就比较理想了。 看来,这个问题,也被计算机老师忽略了,所以,图片中所给出的 X、Y 的位数,是相同的。 用相同位数的两个数做除法,就比较难办了。
为了弥补被除数位数的不足,他们就在计算过程中,在右边偷偷的添上了 4 个零。
但是,即使是零,也不是可以随便添的。
添上了,它就要参加除法运算的。
因此,实际上的被除数,就是:+1000 0000 了。 其十进制就是:+128。
这个做法,就相当于把 X 的小数点右移了四位。
而除数,没有变动,依旧是:-1011。 其十进制还是:-11。
那么,由此再算出的商和余数,也都应该在原来的基础上,把小数点右移四位。
由图可知,商数(Q) 的补码是 1.0101,右移 4 位即为:10101。
余数(R) 的补码是 0.0111,右移 4 位即为:00111。
由此可以导出,X / Y 的商数:Q =-1011 =-11 (十进制)。
X / Y 的余数:R = +111 = +7 (十进制)。
最后,可得出: X / Y = Q + R / Y =-1011 - 0111 / 1011。
(另外说一句:图片给出的答案,其写法是错误的。)
换算到十进制,就是:X / Y = 128 / (-11 ) =-11 - 7 / 11。
也可以写成:X / Y = 128 / (-11 ) =-11,余 7。
验算,大家都会的,此处不再赘述。
上图中的原始数据和最终的计算结果,其对应的关系,是完全正确的。
为了验证这个算法正确,做而论道又用另外的数据如法炮制,也希望得到正确的结果,但是 ... 。 先看看下图吧。
这是用二进制计算:128 ÷ 10 = 12,余 8,应该没错的吧?
采用补码加减交替法做除法,全部计算过程,如下所示。
图中的计算过程,是按照前面图片给出的方法做下来的。 做而论道觉得,好像也没有弄错。 大家也可以帮个忙,仔细看看有什么遗漏。
按照图片上的运算结果,可得出:
128 / (-10) =-13,余-2。
用公式来验算,这结果也是没错的。
但是,正确的运算结果,不应该是【商-12,余 8】吗?
本方法怎么会算出来 “商-13,余-2” 呢?
做而论道还实验了另外几组数字,得出的结果,就不忍直视了。
验算,都没有问题。 但是,它们就是不符合除法运算的常规。
只有一组还不错,就是前面图片中,老师拿来做例题用的。
按此来说,用补码加减交错做除法,其正确性,还有待考证。
--本文完--