方法一:恢复余数法 1. 被除数、余数存储在ACC中,除数存储在通用寄存器中,商存储在MQ中。 2. 因为计算机不知道商0还是商1,但是会默认先商1,所以恢复余数法就是如果商错了,重新商0,并且修改存储在ACC中原本计算出错的余数,使其恢复正确。 3. 图中深灰色的最低一位就是最先参与运算的商,例如图中的例子,计算机会默认先商1,1乘以除数并被送入ALU中参与运算,同时ACC中的被除数也会被送入ALU中参与运算,加法器通过补码实现原码的减法运算(A - B = A +[-B]补),被除数减去除数就能得出第一个余数,但是此时余数的符号位是1,是个负数,说明商错了,此时计算机就明白过来了,应该要商0才对,但是商0不代表要重新计算,此时ACC中的错误余数会被送入ALU中,把错误的余数加上除数,运算结果就是被除数的值,而此时被除数的值也是商0时得出的第一个正确余数,恢复好的余数会被重新送回ACC中。 图中例子得出了01011五位的余数,如果按照手动计算,因为余数是正数,最高位的符号位必为0,可以忽略,末尾补0,从下一位开始错位运算,那么计算机该如何计算? 计算机会把所得的余数逻辑左移一位,即ACC、MQ整体逻辑左移,MQ中的最高位(都是0)往前移一位,移到ACC的最低位,而ACC中的每一位都往前移一位,原本ACC中的最高位就会被丢弃,原本MQ中最低位会空出来,用0补上。 最后重复以上步骤,直到存储商的MQ用完。
手动实现计算机操操作:
方法二:加减交替法(不恢复余数法)
注意:这里探讨的是定点小数的除法,所以我们最终得到的商肯定也是一个定点小数,而不能是一个整数,因此在定点小数的除法运算当中规定:被除数一定要小于除数,因为被除数大于除数的话,商的结果肯定就大于1了,而定点小数无法表达大于1这样的一个范围,那计算机又是怎样检查除数和被除数的大小关系的呢?其实就是通过第一步的商来确定的,第一步 被除数-(商 * 除数)得到的余数一定要是个负值,如果第一步得到的就是一个正值,那么就说明被除数比除数更大,那么此时硬件电路就会检测出这个问题,并且直接停止除法的运算,因为这种除法是没办法用定点小数来表示的。
——————————————————————————————————————
加减交替法: 所以案例中的最终结果为: 原码与补码加减交替法的相同点与不同点: