- 1.54 MB
- 2022-06-14 发布
- 1、本文档由用户上传,淘文库整理发布,可阅读全部内容。
- 2、本文档内容版权归属内容提供方,所产生的收益全部归内容提供方所有。如果您对本文有版权争议,请立即联系网站客服。
- 3、本文档由用户上传,本站不保证质量和数量令人满意,可能有诸多瑕疵,付费之前,请仔细阅读内容确认后进行付费下载。
- 网站客服QQ:403074932
3.2.2定点数运算方法数值运算的核心是指加、减、乘、除四则算术。由于计算机中的数有定点和浮点两种表示形式,因此相应有定点数的运算和浮点数的运算。1.定点加减运算(1)原码加减运算例如,加法指令指示做(+A)+(-B),由于一个操作数为负,实际操作是做减法(+A)-(+B),结果符号与绝对值大的符号相同。同理,在减法指令中指示做(+A)-(-B),实际操作是做加法(+A)+(+B),结果与被减数符号相同。\n在用原码进行加减运算时,计算机实际操作是加还是减取决于指令中的操作码和两个操作数的符号;运算结果的符号判断也较复杂。因此这种方法很少使用。\n(2)补码加减运算①补码加法运算[X]+[Y]=[X+Y]②补码减法运算[X–Y]=[X+(-Y)]=[X]+[-Y]\n1.补码加法运算公式:[x+y]补=[x]补+[y]补以模为2定义的补码为例,分四种情况证明该式的正确性(纯小数)\n① 设x>0,y>0,则x+y>0由补码定义,[x]补=x,[y]补=y,所以[x]补+[y]补=x+y=[x+y]补②x<0,y<0,则(x+y)<0由补码定义,[x]补=2+x,[y]补=2+y[x]补+[y]补=2+x+2+y=2+(2+x+y),由于x+y为负数,其绝对值又小于1,所以(2+x+y)就一定是小于2大于1的数,上式等号右边的2必然丢掉,又由于x+y<0,所以[x]补+[y]补=(2+x+y)=2+(x+y)=[x+y]补\n③x>0,y<0[x]补=x,[y]补=2+y,[x]补+[y]补=x+2+y有两种情况A:当(x+y)≥0时,模2丢掉,又因为(x+y)≥0,所以[x]补+[y]补=2+x+y=x+y=[x+y]补B:当(x+y)<0时,有:[x]补+[y]补=2+x+y=[x+y]补④x<0,y>0情况与③类似。\n2.补码的减法运算公式[x–y]补=[x+(–y)]补=[x]补+[–y]补只要证明[–y]补=–[y]补,上式即得证。证明如下:\n由于[x+y]补=[x]补+[y]补,可得①[y]补=[x+y]补–[x]补,又[x–y]补=[x+(–y)]补=[x]补+[–y]补,同理可得②[–y]补=[x–y]补–[x]补①+②得[–y]补+[y]补=[x–y]补–[x]补+[x+y]补–[x]补=[x–y]补+[x+y]补–[x]补–[x]补=[x–y+x+y]补–[x]补–[x]补=[2x]补–2[x]补=0从而有[–y]补=–[y]补[mod2]只要求得[–y]补,就可以变减法为加法,已知[y]补,求[–y]补的法则是:对[y]补各位(包括符号位)取反,然后在末位加上1,就可以得到[–y]补。\n③补码运算规则根据以上讨论,可将补码加减规则归纳如下:参加运算的操作数用补码表示。符号位参加运算。若指令操作码为加,则两数直接相加;若操作码为减,则将减数连同符号位一起变反加1后再与被减数相加。运算结果用补码表示。【例3-3】[X]=00110110,[Y]=11001101,求[X+Y],[X-Y]。\n(3)溢出判别在什么情况下可能产生溢出?例:设定点整数字长8位,补码表示(最高位为符号位),表示范围为-128127,运算结果超出此范围就发生溢出。\n0001111100001101(1)31+13=44001011000111111101000001(3)63+66=129100000011100000110111110(4)-63+(-66)=-12901111111正溢负溢(2)-31+(-12)=-43111000011111010011010101\n①采用一个符号位判断溢出=S+AB②采用最高有效位的进位判断溢出=C+C=CC③采用变形补码判断(双符号位)用S、Sn分别表示结果最高符号位和第2符号位溢出=SS两正数相加结果为负或两负数相加结果为正,则溢出符号位产生的进位与最高有效位产生的进位情况不同,则溢出01:结果正溢10:结果负溢\n\n\n\n\n\n3.定点数乘除运算(1)无符号整数一位乘法计算机中的乘法运算采用的方法是:将n位乘转换为n次“累加与移位”,即每一步只求一位乘数所对应的新部分积,并与原部分积作一次累加,然后右移一位。\n右图是无符号整数一位乘的算法流程图。图中使用了3个寄存器A、B和C。B用来存放被乘数;C存放乘数;A初值为0,然后存放部分积,最后存放乘积高位。由于乘数每乘一位该位代码就不再使用,因此用A和C寄存器联合右移以存放逐次增加的部分积,并且使每次操作依据的乘数位始终在C的最低位。乘法完成时,A与C存放的是最后乘积,其中C的内容是乘积的低位部分。\n实现无符号整数一位乘法的硬件原理框图如下图所示。图中,用进位触发器Ca保存每次累加暂时产生的进位,它的初值为0。在被乘数送入B、乘数送入C,A和Ca被置0后,控制逻辑控制乘法进入第1个节拍,这时由乘数位C0产生“加B/不加”(不加相当于加0)信号,用以控制被乘数B是否与上次部分积相加产生本次部分积,然后Ca、A、C一起右移一位。重复n个节拍的操作后所得到的乘积存放在A和C中。\n【例3-10】1101*1011的运算过程如图所示。\n\n例2.13设x=–0.1101,y=–0.1011,求[x×y]原=?\n上一例在演算时也可以先计算两小数的小数部分,算完小数部分积后再考虑积的的小数部分位数,添上小数点。\n定点除法运算\n遇到的问题\n(2)无符号整数一位除法在计算机中实现除法运算,着重要解决如何判断够减与否的问题,可以用以下两种办法:①用逻辑线路进行比较判别,又叫做比较法。将被除数或余数减去除数,如果够减就执行一次减法并商1,然后余数左移一位;如果不够减就商0,同时余数左移一位。这种方法的缺点是增加硬件代价。②直接做减法试探,不论是否够减,都将被除数或余数减去除数。若所得余数符号位为0(即正)表明够减,上商1;若余数符号位为1(即负)表明不够减,由于已做了减法,因此上商0并加上除数(即恢复余数);然后余数左移一位再做下一步。这就是恢复余数法。\n\n\n通过分析恢复余数法可以发现:当余数A为正时,上商1,下一步A左移一位再减除数B,相当于执行2A-B的运算;若余数A为负,上商0,并加除数以恢复余数即A+B,下一步左移一位减去除数B,这实际相当于执行2(A+B)-B=2A+B故在出现不够减时,并不需要恢复余数,只是下一步要进行2A+B的操作,因此称为不恢复余数法或加减交替法。其算法流程如右图所示。图中使用3个寄存器A、B和C。运算开始时,n位除数存放在B中,2n位被除数存放在A和C寄存器中。除法完成后商放在C寄存器中,余数放在A寄存器中。从图中可以看出,在重复n-1次操作后,如果A中的余数为负,需要恢复余数做A+B。这一步是必需的,因为最后的寄存器A中应获得正确的正余数。\n\n【例3-11】用不恢复余数法计算00001000÷0011。解:A、C:00001000;B:0011;[-B]补:1101。其运算过程如右图。\n\n\n例x=+0.1001y=-0.1011求[x/y]原\n3.2.3浮点数运算方法1.浮点数加减运算设有两个浮点数:X=Mx·,Y=My·。要实现X+Y的运算,需要以下4个步骤才能完成。①对阶操作对阶的规则是:阶码小的数向阶码大的数对齐②实现尾数的加(减)运算③结果规格化和溢出判断a.左规b.右规若运算结果是非规格化的数,例如尾数是11.1x…x或00.0x…x形式,就需要将尾数左移,每左移一位,阶码减1,直至满足规格化条件为止(即尾数最高有效位的真值为1,或尾数符与最高有效位不等),这个过程称为左规。在左规的同时应判断结果是否会下溢,即阶码小于所能表示的最小负数。若运算结果尾数发生溢出,例如尾数为10.xx…x或01.xx…x形式,这并不表明浮点结果会溢出,此时需调整阶码,将尾数右移一位,阶码加1,称为右规。右规时,应判断结果是否会上溢,即阶码大于所能表示的最大正数。④舍入操作恒舍法,恒进法,0舍1进法为什么不是阶码大的数向阶码小的数对齐?\n下面举一个浮点加的实例。【例3-12】设有两个浮点数X=20.1101012,Y=2(-0.101011)2。阶码尾数[X]浮=11,10;00.110101[Y]浮=11,11;11.010101①对阶[E]=[EX]+[-EY]=1110+0001=1111,即E=-1,将MX右移一位,其阶码加1,得=11,11;00.011011(用0舍1入法)②尾数求和00.011011+11.01010111.110000③规格化及判溢出左规得[X+Y]浮=1110;11.10000④舍入由于是左规,结果不需要舍入。最后运算结果的真值为X+Y=2(-0.100000)2。\n\n