新编计算机组成原理习题与解析.doc
新编计算机组成原理习题与解析新编计算机组成原理习题与解析1.单项选择题【例1】在浮点数运算中溢出的条件是。A.阶码最高位有进位B.结果尾数溢出C.阶码溢出D.尾数规格化后阶码溢出解:在浮点数运算中,只有尾数规格化后阶码溢出,才表示运算结果溢出。本题答案为D。【例2】在浮点数运算中,下溢出指的是。A.运算结果的绝对值小于机器所能表示的最小绝对值B.运算的结果小于机器所能表示的最小负数C.运算的结果小于机器所能表示的最小正数D.运算结果的最低有效位产生的错误解:在浮点数运算中,下溢出指的是运算的结果小于机器所能表示的最小负数,主要表现是规格化后阶码小于其能表示的最小负数。本题答案为B。【例3】浮点加减中的对阶是指。A.将较小的一个阶码调整到与较大的一个阶码相同B.将较大的一个阶码调整到与较小的一个阶码相同C.将被加数的阶码调整到与加数的阶码相同D.将加数的阶码调整到与被加数的阶码相同解:浮点加减中的对阶是将较小的一个阶码调整到与较大的一个阶码相同。本题答案为A。【例4】两个浮点数相加,阶码用原码表示,一个数的阶码为7,另一个数的阶码为10,则需要将阶码较小的浮点数的小数点。A.左移2位B.左移3位C.右移2位D.右移3位解:在对阶时总是让小阶码向大阶码看齐,这里将小阶码变为10,对应的尾数相应减小,即将小阶码的尾数右移3位,相当于它的小数点左移3位。本题答案为B。【例5】两个浮点数相加,阶码为5位(含1位符号位),阶码用二进制移码表示,_的阶码为10(10),y的阶码为11000(8),则需要将阶码较小的浮点数的尾数。A.左移2位B.左移3位C.右移2位D.右移3位解:_的阶码为10,即_=00,对应十进制数10,y的阶码为11000,即y=01000,对应十进制数8,两者相差2,所以需要将阶码较小的浮点数y的尾数右移2位。本题答案为C。也可以这样来求解,因为_移=10,y移=11000,所以有_-y移=_移-y移+ 2n=10-11000+10000=10010+10000=10010,则_-y=00010,为十进制数2。【例6】若浮点数采用补码表示,判断加/减运算的结果是否为规格化数的方法是。A.阶符和数符相同B.阶符和数符相异C.数符和尾数最高位相同D.数符和尾数最高位相异解:一个浮点数用二进制补码表示,若符号位与尾数最高位相异,则该数是规格化表示。本题答案为D。2.填空题【例7】在浮点加减法运算中,当运算结果的尾数的绝对值大于1时,需要对结果进行,其操作是。解:本题答案是:向右规格化尾数右移一位,右边补一个0,阶码减1,直到尾数绝对值0.5。【例8】设两个浮点数为_=201×0.1,y=211×(-0.0)。假设尾数在计算机中以补码表示(4位尾数,另有2位符号位),阶码(2位阶码)以原码表示(另有2位阶符位),求_+y 的结果是。解:将_、y转换成浮点数据格式,_浮=0001,00.1,y浮=0011,11.0110,相加运算的步骤如下。对阶:求得阶差为11-01=10,即2,因此将_的尾数右移两位,得_浮=00 11,00.0011 01。对尾数求和,得_+y浮=00 11,11.1001 01。规格化:由于符号位和第一位数相等,不是规格化数,故向左规格化,得_+y浮=00 10,11.0010 10。舍入:采用0舍1入法,得_+y浮=00 10,11.0011。判溢:数据无溢出,因此结果为_+y=2021×(-0.1)。本题答案为:2021×(-0.1)。3.问答题【例9】什么是浮点数的溢出?什么情况下会发生上溢出?什么情况下会发生下溢出?解:浮点数的运算结果可能出现以下几种情况。l 阶码上溢出:当一个正指数超过了最大允许值,此时,浮点数发生上溢出(即向方向溢出)。如果结果是正数,则发生正上溢出(有的机器把值置为+);如果是负数,则发生负上溢出(有的机器把值置为)。这种情况为软件故障,通常要引入溢出故障处理程序来处理。l 阶码下溢出:当一个负指数比最小允许值还小,此时,浮点数发生下溢出。一般机器把下溢出时的值置为0(+0或0)。l 尾数溢出:当尾数最高有效位有进位时,发生尾数溢出。此时,进行“右规”操作:尾数右移一位,阶码加1,直到尾数不溢出为止。此时,只要阶码不发生上溢出,则浮点数不会溢出。l 非规格化尾数:当数值部分高位出现0时,尾数为非规格化形式。此时,进行“左规”操作,即尾数左移一位,阶码减1,直到尾数为规格化形式为止。【例10】已知两个实数_=-68,y=-8.25,它们在C语言中定义为float型变量,分别存放在寄存器A和B中。另外,还有两个寄存器C和D。A、B、C、D都是32位的寄存器。请回答下列问题(要求用十六进制表示二进制序列):(1)寄存器A和B中的内容分别是什么?(2)_和y相加后的结果存放在C寄存器中,寄存器C中的内容是什么?(3)_和y相减后的结果存放在D寄存器中,寄存器D中的内容是什么?解:(1)在计算机中,float型的变量都被表示成IEEE 754单精度格式。_=-68=-(1000100)2=-1.0001×26,符号位为1,阶码为127+6=128+5=(1000 0)2,尾数为1.0001,所以小数部分为:000 1000 0000 0000 0000 0000,合起来后整个浮点数表示为:1 1000 0 000 1000 0000 0000 0000 0000,写成十六进制为:C2880000H。y=-8.25=-(1000.01)2=-1.00001×23,符号位为1,阶码为127+3=128+2=(1000 0010)2,尾数为1.00001,所以小数部分为:000 0100 0000 0000 0000 0000,合起来后整个浮点数表示为:1 1000 0010 000 0100 0000 0000 0000 0000,写成十六进制为C1040000H。因此,寄存器A和B中的内容分别是C2880000H、C1040000H。(2)两个浮点数相加的步骤如下。对阶:E_=10000,Ey=10000010,则E_-Ey补=E_补+-Ey补=10000+0110=00000011。E_大于Ey,所以对y进行对阶。对阶后,y=-0.00100001×26。尾数相加:_的尾数为-1.000 1000 0000 0000 0000 0000,y的尾数为-0.001 0000 1000 0000 0000 0000,用原码加法运算实现,两数符号相同,做加法,结果为-1.001 1000 1000 0000 0000 0000,即_加y的结果为-1.001 1000 1×26,所以符号位为1,尾数为:001 1000 1000 0000 0000 0000,阶码为127+6=128+5,即:1000 0。合起来为:1 1000 0 001 1000 1000 0000 0000 0000,转换为十六进制形式为:C2988000H。所以,寄存器C中的内容是C2988000H。(3)两个浮点数相减的步骤同加法,对阶的结果也相同,只是尾数相减。_的尾数为-1.000 1000 0000 0000 0000 0000,y的尾数为-0.001 0000 1000 0000 0000 0000。用原码减法运算实现,两数符号相同做减法时,符号位取大数的符号,即为负数,所以为1。数值部分是大数加小数负数的补码:1.000 1000 0000 0000 0000 0000+ 1.110 1000 0000 0000 00000.111 0111 1000 0000 0000 0000_减y的结果为-0.1110×26=-1.110×25,所以:符号位为1,尾数为110 0000 0000 0000 0000,阶码为127+5=128+4,即1000 0100。合起来为:1 1000 0100 110 0000 0000 0000 0000,转换为十六进制形式为:C26F0000H,所以寄存器D中的内容是C26F0000H。【例11】两个规格化浮点数求和、差,最后对结果规格化时,能否确定需要右规的次数?能否确定需要左规的次数?解:两个n位数相加、减,其和、差最多为n+1位,因此有可能需要右规,但右规最多一次。由于异号数相加,或同号数相减,其和、差的最少位数无法确定,因此左规的次数也无法确定,但次数最多不会超过尾数的字长,即n次。【例12】两个规格化浮点数相乘时,是否可能需要右规?为什么?是否可能需要左规?若需要,能否确定左规的次数?解:规格化浮点数相乘时,只有当两个浮点乘数的尾数均为-1时才需要右规。因为(-1)×(-1)=1,-1为规格化数,而+1不是,所以需要右规,使尾数成为+1/2。规格化浮点数相乘时需要左规。规格化尾数的范围为:1/2|M|1,其积的范围为:1/4|积| 【例13】两个规格化浮点数相除,是否可能需要左规?为什么?是否可能需要右规?若需要,能否确定右规的次数?解:规格化浮点数相除时,只有一种情况需要左规,即当被除数的尾数为1/2、除数的尾数为-1时,需要左规。因为(1/2)/(-1)=-1/2,1/2和-1均为规格化数,而-1/2不是,所以需要左规一次,使尾数成为-1。规格化浮点数相除时,被除数、除数均为规格化数,规格化尾数的范围均为:1/2|M|1,所以商的绝对值范围为:1/2|商| 【例14】设阶码为5位(包括2位阶符),尾数为8位(包括2位数符),阶码、尾数均用补码表示,请完成下列取值的_+y、_-y运算:(1)_=2-011×0.100,y=2-010×(-0.00)(2)_=2-×(-0.010),y=2-100×0.010(1)将y规格化后得:y=2-011×(-0.00),_浮=1,00.100,y浮=1,11.000100,解:-y浮=1,00.00。对阶E补=E_补+-Ey补=1+0011=0000,所以E_=Ey。尾数相加相加相减00.100 00.100+ 11.000100 + 00.0011.001 01.100001_+y浮=1,11.001,左规后_+y浮=1100,11.010010,所以_+y=2-100×(-0.110)。_-y浮=1,01.100001,右规后_-y浮=1110,00.1100001,舍入处理得_-y浮= 1110,00.110001,所以_-y=2-110×0.110001。(2)_浮=1,11.010,y浮=1100,00.010,-y浮=1100,11.010。对阶E补=E_补+-Ey补=1+0100=,所以E=-1,_浮=1100,11.101(0)。尾数相加相加相减11.101(0) 11.101(0)+ 00.010 + 11.01000.001(0) 11.01(0)_+y浮=1100,00.001(0),左规后_+y浮=1110,00.1000,所以_+y=2-110×0.1B。_-y浮=1100,11.01(0),所以_-y=2-100×(-0.100001B)。【例15】已知两个浮点数:A=(-0.010011)×2-010,B=(+0.111)×2+001。假定阶码和尾数都用补码表示,阶码4位(含1位符号位),尾数7位(含1位符号位)。试按规格化补码加法规则和步骤,采用0舍1入法,求A+B补是多少?解:求A+B补的步骤如下。求运算中所需的数据A补=(EA补,MA补)=(1.110,1.)。B补=(EB补,MB补)=(0.001,0.111)。-EB补=1.111。求阶差E补EA补-EB补=EA补+-EB补=1.110+1.111=1.。对阶A补变为A"补,A"补=(E"A补,M"A补)=(0.001,1.01)。尾数求和MA补+MB补=11.01+00.111=00.100。A+B补=(0.001,00.100)。规格化已是规格化数。舍入需要舍入。采用0舍1入法,所以有A+B补=0.001,0.101。【例16】用浮点数运算步骤对56+5进行二进制运算,浮点数格式为1位符号位、5位阶码、10位尾码,基数为2。解:(56)10=(111000)2=0.111000×26。(5)10=()2=0.×23。对阶:0.×23=0.000×26。尾数相加:0.111000+0.0000.01。规格化结果:0.01×26。舍入:数据已适合存储,不必舍入。检查溢出:数据无溢出。【例17】设有两个浮点数_和Y,阶码和尾数均以补码表示,已知_的阶码为0010,尾数为0.1001,Y的阶码为1,尾数为0.0111。求_×Y和_÷Y。解:(1)求_×Y的步骤如下。阶码相加:0010+1=。尾数相乘:M_×MY补=0.1001×0.0111=1.0,或M_×MY=-0.00001。向左规格化:左移一位,阶码为-1,乘积的阶码=-1=+=1110(补码),乘积的尾数=1.0100(补码)。舍入:取4位结果,因 1.0100中小数点后第5位为1,所以尾数舍入后为1.0+0.0001=1.0110(补码)。_×Y的补码表示为:阶码为1110,尾数为1.0110。(2)求_÷Y的步骤如下:阶码相减:0010-1=0010+0011=0。尾数相除:M_÷MY补=1.0000。结果不需要规格化。因此_÷Y的补码表示为:阶码为0,尾数为1.0000。第 10 页 共 10 页