原码、补码的除法运算原码除法
原码除法跟原码乘法⼀样,符号位是单独处理的。
即商符由两数符号位进⾏异或运算求得,商值由两数绝对值相除(x*/y*)求得。
恢复余数法:当余数为负时,需加上除数,将其恢复成原来的余数。
1.符号位单独按两数符号异或求得;
参与运算的是绝对值的补码
2.判溢出, 要求|被除数| < |除数| (对⼩数⽽⾔)
(如果是整数,则要求|被除数| > |除数| );
3.被除数减去除数;
4.若所得.余数为正,相应位上商为1,余数左移⼀位,减去[y]补;
若余数为负,相应位上商为0,余数加上除数(恢复余数),再左移⼀位,加上[-y]补;
5.重复第4步,直到求得所要求的商为⽌(移n次)
6.若最后⼀步余数为负,则需要恢复余数。
总结:从以上步骤可以看出,具有n位尾数的合法除法,需要逻辑移位n位,上商n+1次。
例:已知x=-0.10110,y=0.111111,试⽤原码恢复余数法计算[x/y]原?
解:n=5,移5位,上商6次。-y*=-0.11111,因此[-y*]=11.00001。
除数与被除数⼀正⼀负,所以商为负数。
[x/y]原=-0.10110。
余数在计算过程中被左移了5次:0.10110*2^(-5)=0.0000010110。
原码不恢复余数法:不需要恢复余数,将恢复余数的那个步骤定量地表达出来。
恢复余数的步骤:
余数>0恢复余数法是将余数左移⼀位,减去除数R’=2R-y*余数<0先恢复余数,再左移⼀位,再减去除数R’=2R+y*
乘以2相当于左移1位
除以2相当于右移1位
例:已知x=-0.10110,y=0.11111,试⽤原码不恢复余数法计算[x/y]原?
解:-y*=-0.11111,因此[-y*]=11.00001。
除数与被除数⼀正⼀负,所以商为负数。
[x/y]原=-0.10110。
小数的原码补码不恢复余数法(加减交替法)
对于⼩数补码运算,商等于"-1"是被允许的。
算法规则:
1. 符号位参加运算,除数与被除数均⽤双符号补码表⽰、
2. 被除数与除数同号,被除数减去除数,被除数与除数异号,被除数加上除数。
3. 余数与除数同号,商上1,余数左移⼀位减去除数; 余数与除数异号,商上0,余数左移⼀位加上除数。(注意:余数左移加上或减去
除数后就得到了新余数。)
4. 采⽤校正法包括符号在内,重复n+1次3.
[R]补与[y]补商新余数[Ri+1]补
同号1[Ri+1]补=2[Ri]补+[-y]补
异号0[Ri+1]补=2[Ri]补-[y]补
注意,使⽤此运算规则,需要修正商符,末位恒置1,加上1+ 2 -n
可见,假商=0.001,需要加上1+2,由于这⾥n=4,所以商=0.001+1.0001=1.0011
[x/y]补=1.0011
余数左移了4次,最后余数需要乘以2。
补码的右移是补符号位,这⾥的余数是负数,右移时需要补1,即真正的余数为1.11111110。
总结:可见,n位⼩数补码除法共上商n+1次(恒置“1”也算上商⼀次),且共移位n次。
《计算机组成原理》唐朔飞
《天勤计组⾼分笔记》
此次分享就到这⾥,欢迎⼤家指导指正~ 我是爱吃⾁的⼩⽩yyyloki ,如果你觉得不错的话点个赞 吧!或者你可以关注,持续更新计组。我们下次见~886-n -4