文档库

最新最全的文档下载
当前位置:文档库 > 计算机系统基础第二章习题参考解答-2018

计算机系统基础第二章习题参考解答-2018

第二章习题答案

9.在32位计算机中运行一个C语言程序,在该程序中出现了以下变量的初值,请写出它们对应的机器数(用十六进制表示)。

(1)int x=-32768 (2)short y=522 (3)unsigned z=65530

(4)char c=’@’(5)float a=-1.1 (6)double b=10.5

本题要点:

(1)数据要根据其类型要表示到足够的位数,如题(3),要写成0000FFFA,而不是FFFA

(2)因为求机器数,所以负数要用补码表示

(3)浮点数要用IEEE 754标准编码,要注意是float还是double,分别编码:阶码位数、尾数位数、

偏置常数各不相同。要表示到足够的位数。

(4)16进制数后面要写H标识,二进制数后面要写B标识

参考答案:

(1)FFFF8000H

解:-215=-1000 0000 0000 0000B,负数符号位为1,int型整数表示为32位,

故机器数为1…1 1000 0000 0000 0000=FFFF8000H

(2)020AH

解:522=10 0000 1010B,正数符号位为0,short 型整数表示为16位,

故机器数为0000 0010 0000 1010=020AH

(3)0000FFFAH

解:65530=216-1-5=1111 1111 1111 1010B,unsigned型整数表示为32位,无符号位(高位补0),故机器数为0000FFFAH

(4)40H

解:’@’的ASCII码是40H,char型表示为8位

(5)BF8CCCCCH

解:-1.1=-1.00011 [0011]…B=-1.000 1100 1100 1100 1100 1100B,

float型浮点数,阶码为127+0=01111111(8位),整数部1为隐藏位,负数符号位为1,

故机器数为1 01111111 000 1100 1100 1100 1100 1100=BF8CCCCCH

(6)40250000 00000000H

解:10.5=1010.1B=1.0101B 23(左规),

Double型浮点数,阶码为1023+3=100 0000 0010,整数部1为隐藏位,正数符号位为0,

故机器数为0 100 0000 0010 0101 [0000]=40250000 00000000H

10. 在32位计算机中运行一个C语言程序,在该程序中出现了一些变量,已知这些变量在某一时刻的机

器数(用十六进制表示)如下,请写出它们对应的真值。

(1)int x:FFFF0006H (2)short y:DFFCH (3)unsigned z:FFFFFFFAH

(4)char c:2AH 5)float a:C4480000H (6)double b:C024800000000000H

本题要点

(1)正确换算,结果最好表示成10进制

(2)注意数据类型,准确区分有符号数和无符号数,有符号数最高位为1时为负数

(3)正确解析浮点数

参考答案:

(1)-65530

解:FFFF0006H=1…1 0000 0000 0000 0110B,最高位为1,所以为负数,int型整数,所以真值为其余为取反加1,故x= -1111 1111 1111 1010B= -(65535-5)=-65530

(2)-8196

解:DFFCH=1101 1111 1111 1100B=-010 0000 0000 0100B,最高位为1,所以为负数,short型整数,所以真值为其余为取反加1,故y=-(8192+4)=-8196

(3)4294967290(或232-6)

解:FFFFFFFAH=1…1 1010B,最高位虽然为1,但为unsigned型整数,所以解析为正整数,直接展开换算,故z=232-6=4294967290

(4)字符’*’

解:2AH=0010 1010B,故c的值是42,且c表示字符,故c为字符’*’

(5)-800

解:C4480000H=1100 0100 0100 1000 0…0B,因为是float型浮点数数据,所以按照IEEE 754标准解析。符号位为1,所以为负数;阶码为10001000,减掉偏置常数127后有:阶为136-127=9;尾数考虑隐藏位为:-1.1001B,故a=-1.1001B 29= -11 0010 0000B= -800

(6)-10.25

解:C024800000000000H=1100 0000 0010 0100 1000 0 0…0B,因为是double型浮点数,所以按照IEEE 754标准解析。符号位为1,所以为负数;阶码为100 0000 0010,,减掉偏置常数1023后有:阶为

1026-1023=3;尾数考虑隐藏位为1.01001B,故b=-1.01001B 23= 1010.01B=-10.25

17. 以下是一个由反汇编器生成的一段针对某个小端方式处理器的机器级代码表示文本,其中,最左边

是指令所在的存储单元地址,冒号后面是指令的机器码,最右边是指令的汇编语言表示,即汇编指令。已知反汇编输出中的机器数都采用补码表示,请给出指令代码中划线部分表示的机器数对应的真值。

80483d2: 81 ec b8 01 00 00 sub &0x1b8, %esp

80483d8: 8b 55 08 mov 0x8(%ebp), %edx

80483db: 83 c2 14 add $0x14, %edx

80483de: 8b 85 58 fe ff ff mov 0xfffffe58(%ebp), %eax

80483e4: 03 02 add (%edx), %eax

80483e6: 89 85 74 fe ff ff mov %eax, 0xfffffe74(%ebp)

80483ec: 8b 55 08 mov 0x8(%ebp), %edx

80483ef: 83 c2 44 add $0x44, %edx

80483f2: 8b 85 c8 fe ff ff mov 0xfffffec8(%ebp), %eax

80483f8: 89 02 mov %eax, (%edx)

80483fa: 8b 45 10 mov 0x10(%ebp), %eax

80483fd: 03 45 0c add 0xc(%ebp), %eax

8048400: 89 85 ec fe ff ff mov %eax, 0xfffffeec(%ebp)

8048406: 8b 45 08 mov 0x8(%ebp), %eax

8048409: 83 c0 20 add $0x20, %eax

本题要点:

(1)注意数据是小端方式,所以要注意字节的编排,如5字节:b8 01 00 00,表示的数是“000001b8”。

(2)上述指令都是整数运算指令,所以所有的数据均按整数换算

(3)正确换算,不要计算错了

参考答案:

(1)440

解:b8 01 00 00:4字节,但考虑小端数据格式,所以机器数为000001B8H,符号位为0,所以为正整数,直接展开,真值为+1 1011 1000B = 440

(2)20

解:14:单字节,机器数即为14H,符号位为0,解析为正整数,所以真值为+1 0100B = 20 (3)-424

解:58 fe ff ff:4字节,考虑小端数据格式,所以机器数为FFFFFE58H,符号位为1,所以为负数,真值为其余位取反加1,所以真值为:-1 1010 1000B = -424

(4)-396

解:74 fe ff ff:4字节,考虑小端数据格式,所以机器数为FFFFFE74H,符号位为1,所以为负数,真值为其余位取反加1,所以真值为:-1 1000 1100B = -396

(5)68

解:44:单字节,机器数即为44H,符号位为0,解析为正整数,所以真值为+100 0100B=68 (6)-312

解:c8 fe ff ff:4字节,考虑小端数据格式,所以机器数为FFFFFEC8H,符号位为1,所以为负数,真值为其余位取反加1,所以真值为:-1 1000 1100B = -312

(7)16

解:10:单字节,机器数即为10H,符号位为0,解析为正整数,所以真值为+10000B=16 (8)12

解:0c:单字节,机器数即为0CH,符号位为0,解析为正整数,所以真值为:+1100B=12 (9)-276

解:ec fe ff ff:4字节,考虑小端数据格式,所以机器数为FFFFFEECH,符号位为1,所以为负数,真值为其余位取反加1,所以真值为:-1 0001 0100B = -276

(10)32

解:20:单字节,机器数即为20H,符号位为0,解析为正整数,所以真值为+00100000B=32 21.以下是两段C语言代码,函数arith( )是直接用C语言写的,而optarith( )是对arith( )函数以某个确定

的M和N编译生成的机器代码反编译生成的。根据optarith( ),可以推断函数arith( ) 中M和N的值

各是多少?

#define M

#define N

int arith (int x, int y)

{

int result = 0 ;

result = x*M + y/N;

return result;

}

int optarith ( int x, int y)

{

int t = x;

x << = 4;

x – = t;

if ( y < 0 ) y += 3;

y>>2;

return x+y;

}

本题要点:

直接用C语言写的源代码和反编译后的代码形式上不一致,所以要从功能的角度分析,而不能只从字面看。

参考答案:

答案:M=15,N=4

解:(1)对照源代码语句中的“x*M”和反编译代码中的“int t = x; x << = 4; x-=t;”,可以分析出,反编译代码是将x乘以4(x << = 4),然后减去x的原值(t是x的备份,x-=t相当于减去x的原值),所以这三条语句实现的功能是:x乘15。因此,M等于15;

(2)对照源代码语句中的“y/N”与反编译代码中的“if ( y < 0 ) y += 3; y>>2;”,可以分析出,“y>>2”实现了y除以4的功能,因此N是4。

而比较迷惑的是第一句“if ( y < 0 ) y += 3;”什么意思呢:

其意图主要在于:对y= –1时进行调整。若不调整,则–1>>2= –1(-1的补码表示是FFFFFFFFH,移位后还是FFFFFFFFH,其值还是-1),而–1/4=0(数学定义),所以两者不等,不符合数学定义;故做上述调整,调整后–1+3=2,2>>2=0,两者相等,正确。

24.设一个变量的值为4098,要求分别用32位补码整数和IEEE 754单精度浮点格式表示该变量(结果用十六进制形式表示),并说明哪段二进制位序列在两种表示中完全相同,为什么会相同?

本题要点:

(1)按照32位补码整数和IEEE 754单精度浮点格式准确表示4098的值,尤其是浮点数位串不要搞错了。

(2)找出位串相同的部分,为什么相同主要是4098数比较小,在32位补码整数(且为正数)和23位浮点尾数部分都能精确表示(没有舍入),所以对应相等(除了浮点数最高位,因为浮

点数有1个隐藏位)。

参考答案:

解:4098 = +1 0000 0000 0010B(整数)= +1. 0000 0000 001 × 212(规格化浮点数)(1)32位2-补码形式为:0000 0000 0000 0000 0001 0000 0000 0010(即00001002H)

(2)IEEE754单精度格式为:0 10001011 0000 0000 0010 0000 0000 000 (即45801000H)

对照(1)和(2)的位串,粗体部分的12位位串为相同部分。

注:浮点数中粗体部分为除隐藏位外的有效数字,只考虑这12位,阶码中最后一个1不考虑。

28.假定在一个程序中定义了变量x、y和i,其中,x和y是float型变量(用IEEE754单精度浮点数表示),i是16位short型变量(用补码表示)。程序执行到某一时刻,x= –0.125、y=7.5、i=100,它们都被写到了主存(按字节编址),其地址分别是100,108和112。请分别画出在大端机器和小端机器上变量x、y和i中每个字节在主存的存放位置。

本题要点:

(1)正确区分大端、小端数据表示,注意字节顺序。

(2)将x、y和i根据其类型正确换算成相应的位串(机器数),尤其是浮点数,要会转换成二进制。注意:长度不同,x和y是32位,i是16位。

参考答案:

解:

首先,将x、y和i换算成正确的机器数

(1)–0.125 = –0.001B = –1.0 ×2-3,负浮点数,符号位为1,阶码为-3(加偏置常数127后为124),尾数为.0,所以,x在机器内部的机器数为:1 01111100 00…0 (BE00 0000H) (2)7.5= +111.1B= +1.111×22,正浮点数,阶码为2(加偏置常数127后为129),尾数为.111,所以,y在机器内部的机器数为:0 10000001 11100…0 (40F0 0000H)

(3)100=64+32+4=1100100B,正整数,直接转换,所以i在32位的机器内部表示的机器数为:0000 0000 0110 0100(0064H)

所以x、y和i在主存中的情况如下:(注意三个数的起始地址)

大端机小端机

地址内容内容

100BEH 00H

101 00H 00H

102 00H 00H

103 00H BEH

108 40H 00H

109 F0H 00H

110 00H F0H

111 00H 40H

112 00H 64H

113 64H 00H

29. 对于图2.6,假设n=8,机器数X和Y的真值分别是x和y。请按照图2.6的功能填写表2.17,并给

出对每个结果的解释。要求机器数用十六进制形式填写,真值用十进制形式填写。

表2.17 题29用表

计算机系统基础第二章习题参考解答-2018

本题要点:

(1)注意位长只有8位,所以无符号数超过255或有符号数小于-128或大于+127将进位和溢出(2)正确计算有符号数和无符号数的值

(3)正确使用模运算

参考答案:

表2.17 题29用表

计算机系统基础第二章习题参考解答-2018

(1)无符号整数176+140=316,无法用8位无符号数表示,即结果应有进位,CF应为1。减256,得60,验证正确。

(2)无符号整数176-140=36,可用8位无符号数表示,即结果没有进位,CF应为0。验证正确。

(3)带符号整数-80+(-116)=-196,无法用8位有符号数表示,即结果溢出,OF应为1,加256,得60。验证正确。

(4)带符号整数-80-(-116)=36,可用8位有符号数表示,即结果不溢出,OF应为0。验证正确。

(5)无符号整数126+93=219,可用8位无符号数表示,即结果没有进位,CF应为0。验证正确。

(6)无符号整数126-93=33,可用8位无符号数表示,即结果没有进位,CF应为0。验证正确。

(7)带符号整数126+93=219,无法用8位有符号数表示,即结果溢出,OF应为1。减256,得-37,验证正确。

(8)带符号整数126-93=33,可用8位有符号数表示,即结果不溢出,OF应为0。验证正确。

注:无符号整数的加减运算的结果是否溢出,通过进位/借位标志CF来判断,而带符号整数的加减运算结果是否溢出,通过溢出标志OF来判断。

31.对于第2.7.5节中例2.31存在的整数溢出漏洞,如果将其中的第5行改为以下两个语句:unsigned long long arraysize=count*(unsigned long long)sizeof(int);

int *myarray = (int *) malloc(arraysize);

已知C语言标准库函数malloc的原型声明为“void *malloc(size_t size);”,其中,size_t定义为unsigned int类型,则上述改动能否消除整数溢出漏洞?若能则说明理由;若不能则给出修改方案。

本题要点:

(1)主要是传递给malloc的参数arraysize的值超过unsigned int所致。

(2)不能通过重写malloc函数,将其参数类型更改为unsigned long long来解决,因为C语

言函数库里的函数不是普通用户能修改的——那是开发C语言及其编译器本身的人做的

事。你所要做的是在调用malloc分配空间前,主动检查arraysize的值是不是超过size_t

的表示范围,如果是,就不要调用malloc,直接退出。而只有合法大小的数量才为之申

请空间。

参考答案:

上述改动无法消除整数溢出漏洞。

分析:这种改动方式虽然使得arraysize的表示范围扩大了,避免了arraysize的溢出,不过,当调用malloc函数时,若arraysize的值大于32位的unsigned int的最大可表示值,则malloc函数还是只能按32位数给出的值去申请空间,同样会发生整数溢出漏洞。

程序应该在调用malloc函数之前检测所申请的空间大小是否大于32位无符号整数的可表示范围,若是,则返回-1,表示不成功;否则再申请空间并继续进行数组复制。

修改后的程序如下:

1/* 复制数组到堆中,count为数组元素个数 */

2int copy_array(int *array, int count) {

3 int i;

4 /* 在堆区申请一块内存 */

5unsigned long long arraysize=count*(unsigned long long)sizeof(int);

6 size_t myarraysize=(size_t) arraysize; /*将arraysize强制转换成size_t*/

7 if (myarraysize!=arraysize) /*然后比较转换后的myarraysize和arraysize,如果二

者不等,这表示转换过程有数据丢失,原数据arraysize在

size_t型范围内溢出,此时不能申请空间,直接退出*/

8 return -1;

9 int *myarray = (int *) malloc(myarraysize);

10 if (myarray == NULL)

11 return -1;

12 for (i = 0; i < count; i++)

13 myarray[i] = array[i];

14 return count;

15}

34. 无符号整数变量ux和u y的声明和初始化如下:

unsigned ux=x;

unsigned uy=y;

若sizeof(int)=4,则对于任意int型变量x和y,判断以下关系表达式是否永真。若永真则给出证明;

若不永真则给出结果为假时x和y的取值。

(1)(x*x) >= 0 (2)(x-1<0) || x>0

(3)x<0 || -x<=0 (4)x>0 || -x>=0

(5)x&0xf!=15 || (x<<28)<0 (6)x>y==(-x<-y)

(7)~x+~y==~(x+y) (8)(int) (ux-uy) == -(y-x)

(9)((x>>2)<<2) <=x (10)x*4+y*8==(x<<2)+(y<<3)

(11)x/4+y/8==(x>>2)+(y>>3) (12)x*y==ux*uy

(13)x+y==ux+uy (14)x*~y+ux*uy==-x

本题要点:

(1)x、y是有符号数,ux、uy是无符号数。在机器码层面,[x]补=ux,[y]补=uy,所以x和y 的运算,机器级等价于ux和uy的运算,然后再把结果解析成为带符号数。

(2)x、y向ux、uy赋值,所以,如果x、y是正数,则ux、uy的值直接等于x、y。如果x、y是负数,则ux、uy的值等于x、y的补码(然后被当作无符号正整数看待)。

(3)对题目中各表达式的判别,主要是看运算表达式的值有没有溢出,有的话,可能正变负或负变正,这时候使得条件不能永真。

(4)特别注意-2 147 483 648机器码表示的特殊性

(5)不管是有符号还是无符号数,都是按照统一的规则做运算:补码运算

(5)本题只为各式判定是否永真(在任何情况下都为真),而不能简单表示为“对”或“错”

参考答案:

(2)(x-1<0) || x>0

非永真。当x=-2 147 483 648时,显然,x<0,机器数为80000000H,x-1的机器数为7FFFFFFFH (这是因为在运算器上不去分有符号还是无符号,直接计算),符号位为0,因而x-1>0。此时,(x-1<0) 和x>0两者都不成立。

(4)x>0 || -x>=0

非永真。当x=-2 147 483 648时,x<0,且x和-x的机器数都为80000000H,即-x<0。此时,x>0和-x>=0两者都不成立。

(6)x>y==(-x<-y)

非永真。当x=-2 147 483 648、y任意(除-2 147 483 648外),或者y=-2 147 483 648、x任意(除-2 147 483 648外)时不等。因为int型负数-2 147 483 648是最小负数,该数取负后结果仍为-2 147 483 648(机器数),而不是2 147 483 648。所以仍是最小负数,和任意其它数比还是小。

(8)(int) (ux-uy) ==-(y-x)

永真。(int) (ux-uy)=[x-y]补=[x]补+[-y]补=[-y+ x]补= [-(y-x)]补

(10)x*4+y*8==(x<<2)+(y<<3)

永真。因为带符号整数x乘以2k完全等于x左移k位,无论结果是否溢出。

(12)x*y==ux*uy

永真。根据第2.7.5节P65页内容可知,x*y的低32位和ux*uy的低32位是完全一样的位序列。

(14)x*~y+ux*uy==-x

永真。这里~y是按位取反,不是负运算。所以,[-y=~y+1]补,即[~y=-y-1]补。而根据(12),ux*uy=x*y,因此,等式左边为x*(-y-1)+x*y=-x。

34. 无符号整数变量ux和u y的声明和初始化如下:

unsigned ux=x;

unsigned uy=y;

若sizeof(int)=4,则对于任意int型变量x和y,判断以下关系表达式是否永真。若永真则给出证明;若不永真则给出结果为假时x和y的取值。

(1)(x*x) >= 0 (2)(x-1<0) || x>0

(3)x<0 || -x<=0 (4)x>0 || -x>=0

(5)x&0xf!=15 || (x<<28)<0 (6)x>y==(-x<-y)

(7)~x+~y==~(x+y) (8)(int) (ux-uy) == -(y-x)

(9)((x>>2)<<2) <=x (10)x*4+y*8==(x<<2)+(y<<3)

(11)x/4+y/8==(x>>2)+(y>>3) (12)x*y==ux*uy

(13)x+y==ux+uy (14)x*~y+ux*uy==-x

参考答案:

(1)(x*x)>=0

非永真。例如,x=65 534时,则x*x=(216-2)* (216-2)= 232-2*2*216+4 (mod 232)=-( 218-4)=-262140。

x的机器数为0000FFFEH,x*x的机器数为FFFC0004H。

(2)(x-1<0) || x>0

非永真。当x=-2 147 483 648时,显然,x<0,机器数为80000000H,x-1的机器数为7FFFFFFFH,符号位为0,因而x-1>0。此时,(x-1<0) 和x>0两者都不成立。

(3)x<0 || -x<=0

永真。若x>0,x符号位为0且数值部分为非0(至少有一位是1),从而使-x的符号位一定是1,即则-x<0;若x=0,则-x=0。综上,只要x<0为假,则-x<=0一定为真,因而是永真。

(4)x>0 || -x>=0

非永真。当x=-2 147 483 648时,x<0,且x和-x的机器数都为80000000H,即-x<0。此时,x>0和-x>=0两者都不成立。

(5)x&0xf!=15 || (x<<28)<0

非永真。这里!=的优先级比&(按位与)的优先级高。因此,若x=0,则x&0xf!=15为0,(x<<28)<0也为0,所以结果为假。

(6)x>y==(-x<-y)

非永真。当x=-2 147 483 648、y任意(除-2 147 483 648外),或者y=-2 147 483 648、x任意(除-2 147 483 648外)时不等。因为int型负数-2 147 483 648是最小负数,该数取负后结果仍为-2 147 483 648,而不是2 147 483 648。

(7)~x+~y==~(x+y)

永假。[-x]补=~[x]补+1,[-y]补=~[y]补+1,故~[x]补+~[y]补=[-x]补+[-y]补-2。

[-(x+y)]补=~[x+y]补+1, 故~[x+y]补=[-(x+y)]补-1=[-x]补+[-y]补-1。

由此可见,左边比右边少1。

(8)(int) (ux-uy) ==-(y-x)

永真。(int) ux-uy=[x-y]补=[x]补+[-y]补=[-y+ x]补= [-(y-x)]补

(9)((x>>2)<<2) <=x

永真。因为右移总是向负无穷大方向取整。

(10)x*4+y*8==(x<<2)+(y<<3)

永真。因为带符号整数x乘以2k完全等于x左移k位,无论结果是否溢出。

(11)x/4+y/8==(x>>2)+(y>>3)

非永真。当x=-1或y=-1时,x/4或y/8等于0,但是,因为-1的机器数为全1,所以,x>>2或y>>3还是等于-1。此外,当x或y为负数且x不能被4整除或y不能被8整除,则x/4不等于x>>2,y/8不等于y>>3。

(12)x*y==ux*uy

永真。根据第2.7.5节内容可知,x*y的低32位和ux*uy的低32位是完全一样的位序列。

(13)x+y==ux+uy

永真。根据第2.7.4节内容可知,带符号整数和无符号整数都是在同一个整数加减运算部件中进行运算的,x和ux具有相同的机器数,y和uy具有相同的机器数,因而x+y和ux+uy具有完全一样的位序列。

(14)x*~y+ux*uy==-x

永真。-y=~y+1,即~y=-y-1。而ux*uy=x*y,因此,等式左边为x*(-y-1)+x*y=-x。

35. 变量dx、dy和dz的声明和初始化如下:

double dx = (double) x;

double dy = (double) y;

double dz = (double) z;

若float和double分别采用IEEE 754单精度和双精度浮点数格式,sizeof(int)=4,则对于任意int型变量x、y和z,判断以下关系表达式是否永真。若永真则给出证明;若不永真则给出结果为假时x和y 的取值。

(1)dx*dx >= 0 (2)(double)(float) x == dx

(3)dx+dy == (double) (x+y) (4)(dx+dy)+dz == dx+(dy+dz)

(5)dx*dy*dz == dz*dy*dx (6)dx/dx == dy/dy

本题要点:

(1)注意IEEE 754运算规则

(2)整型数向float转换可能会发生数据丢失,应为float的尾数只有23+1位

(3)浮点数运算存在舍入问题

参考答案:

(1)dx*dx >= 0

永真。double型数据用IEEE 754标准表示,尾数用原码小数表示,符号和数值部分分开运算。

不管结果是否溢出都不会影响乘积的符号。

(3)dx+dy == (double) (x+y)

非永真。因为x+y可能会溢出,而dx+dy不会溢出。

(5)dx*dy*dz == dz*dy*dx

非永真。浮点乘可能产生舍入,使得浮点乘不满足交换律等。

36. 在IEEE 754浮点数运算中,当结果的尾数出现什么形式时需要进行左规,什么形式时需要进行右规?

如何进行左规,如何进行右规?

本题要点:

(1)本题旨在考查浮点数左规和右规的规则,照其基本规则回答即可。

(2)本题对于理解浮点数左规和右规的规则非常重要,重点关注

参考答案:

(1)对于结果为±1x.xx…x的情况,需要进行右规。右规时,尾数右移一位,阶码加1。右规操作可以表示为:M b←M b ×2 -1,E b←E b+1。右规时注意以下两点:

①尾数右移时,最高位“1”被移到小数点前一位作为隐藏位,最后一位移出时,要考虑舍入。

②阶码加1时,直接在末位加1。

(2)对于结果为±0.00…01x…x的情况,需要进行左规。左规时,数值位逐次左移,阶码逐次减1,直到将第一位“1”移到小数点左边。假定k为结果中“±”和最左边第一个1之间连续0的个数,则左规操作可以表示为:M b←M b ×2k,E b←E b–k。左规时注意以下两点:

①尾数左移时数值部分最左边k个0被移出,因此,相对来说,小数点右移了k位。因为进行

尾数相加时,默认小数点位置在第一个数值位(即:隐藏位)之后,所以小数点右移k位后

被移到了第一位1后面,这个1就是隐藏位。

②执行E b←E b–k时,每次都在末位减1,一共减k次。

39.采用IEEE 754单精度浮点数格式计算下列表达式的值。

(1)0.75+(– 65.25) (2)0.75–(– 65.25)

本题要点:

(1)本题旨在考查手工模拟浮点数加、减过程,而不是只写出最后的答案,否则就没有意义了。

(2)浮点数加、减过程中,要有对阶、尾数运算、规格化、舍入等关键步骤,所以回答本题时应予体现,否则,等于白做了

参考答案:

首先,将两个浮点数表示成规格化的IEEE 754格式的机器数。

(1)x = 0.75 = 0.110...0B = (1.10...0)2 × 2-1,

y = – 65.25 = – 1000001.01000...0B = (–1.00000101...0) 2 × 26

用IEEE 754标准单精度格式表示为:

[x]浮= 0 01111110 10...0 :阶码E x= 01111110,尾数M x= 0(1). 1 0

[y]浮= 1 10000101 000001010...0 :阶码E y= 10000101,尾数M y =1 (1).000001010 0

尾数M x和M y用原码表示,其中小数点前写了2位,第一位是符号位,第二位是隐藏位“1”,加了括号。

然后,详细描述计算机中进行浮点数加减运算的过程:(假定保留2位附加位:保护位和舍入位)(1)0.75+ (– 65.25)

①对阶:[ΔE]补=E x+ [–E y]补(mod 2n) = 0111 1110 + 0111 1011 = 1111 1001,即ΔE = –7。

根据对阶规则可知需对x进行对阶,结果为:E x = E y = 10000101,M x = 00.000000110 (000)

M x右移7位,符号不变,数值高位补0,隐藏位右移到小数点后面,最后移出的2位保留

②尾数相加:M b = M x + M y = 00.000000110...000+ 11.000001010 ...000(注意小数点在隐藏位后)

根据原码加/减法运算规则,得:00.000000110...000+ 11.000001010...000 = 11.000000100 (000)

上式尾数中最左边第一位是符号位,其余都是数值部分,尾数后面两位是附加位(加粗)。

③规格化:尾数数值部分最高位为1,因此不需要进行规格化。

④舍入:把结果的尾数M b中最后两位附加位舍入掉,从本例来看,不管采用什么舍入法,结果

都一样,都是把最后两个0去掉,得:M b = 11.000000100 0

⑤溢出判断:在上述阶码计算和调整过程中,没有发生“阶码上溢”和“阶码下溢”的问题。因

此,阶码E b = 10000101。

最后结果为E b = 10000101,M b = 1(1).00000010…0,即:– 64.5。

(2)0.75–(– 65.25)

①对阶:[ΔE]补= E x + [–E y]补(mod 2n) = 0111 1110 + 0111 1011 = 1111 1001,ΔE = -7。

根据对阶规则可知需要对x进行对阶,结果为:E x = E y = 10000110,M x = 00.000000110 (000)

M x右移一位,符号不变,数值高位补0,隐藏位右移到小数点后面,最后移出的位保留

②尾数相加:M b = M x– M y = 00.000000110...000 – 11.000001010...000 (注意小数点在隐藏位后)

根据原码加/减法运算规则,得:00.000000110...000 – 11.000001010...000=01.00001000 (000)

上式尾数中最左边第一位是符号位,其余都是数值部分,尾数后面两位是附加位(加粗)。

③规格化:尾数数值部分最高位为1,不需要进行规格化。

④舍入:把结果的尾数M b中最后两位附加位舍入掉,从本例来看,不管采用什么舍入法,结果

都一样,都是把最后两个0去掉,得:M b = 01.00001000 0

⑤溢出判断:在上述阶码计算和调整过程中,没有发生“阶码上溢”和“阶码下溢”的问题。因

此,阶码E b = 10000101。

最后结果为E b = 10000101,M b = 0(1).00001000…0,即:+66。

人工智能教程习题及答案第2章习题参考解答
人工智能教程习题及答案第2章习题参考解答_计算机软件及应用_IT/计算机_专业资...
计算机体系结构第二章练习题参考解答
计算机体系结构第二章练习题参考解答第二章 2.13 在一台单流水线多操作部件的处...
计算机体系结构第二章练习题参考解答
计算机体系结构第二章练习题参考解答_计算机软件及应用_IT/计算机_专业资料。百...
第二章练习题参考解答_语文_初中教育_教育专区。第二章 在一台单流水线多操作部件...
课后参考答案-第二章部分习题参考答案
课后参考答案-第二章部分习题参考答案_IT认证_资格考试/认证_教育专区。习题 ...
第二章练习题参考解答48755
第二章练习题参考解答48755_语文_初中教育_教育专区。第二章 2.13 在一...
第2章习题参考答案
第2章习题参考答案_司法考试_资格考试/认证_教育专区。第 2 章 习题解答 1...
第二章练习题参考解答
第二章练习题参考解答 练习题 2.1 为了研究深圳市地方预算内财政收入与国内生产...
第二章练习题参考解答
第二章 2.13 在一台单流水线多操作部件的处理机上执行下面的程序,每条指令的取...
第2章 习题参考解答
第2章 习题参考解答_理学_高等教育_教育专区。北邮版《微机原理与接口技术》课后题答案 第2 章 习题参考解答 1.8086 处理器内部一般包括哪些主要部分? 8086 处理......
第2章部分习题参考解答
第2章部分习题参考解答_数学_自然科学_专业资料。2.1 已知半径为 a 的导体...
教材第二章部分习题参考解答Word版
教材第二章部分习题参考解答Word版_英语_高中教育_教育专区。教材第二章部分习题参考解答 一、单选题 1. B 2. A 3. C 4. B 5. D 二、填空题 1.值 ......
第二章习题解答参考答案
第二章习题解答参考答案_专业资料。傅里叶光学基础及答案 第二章 标量衍射理论部分习题解答参考答案 [2-1] 在基尔霍夫衍射公式(2-2-16)或(2-2-20)中......
第二章习题参考答案
第二章习题参考答案第二章 需求、 供给与均衡价 格(题目及习题 解答)一、判 断...
光纤通信课后习题解答第2章习题参考答案
光纤通信课后习题解答第2章习题参考答案_其它课程_高中教育_教育专区。第二章 光...
计算机体系结构习题参考解答
计算机体系结构习题参考解答 ——— 作者: ——— 日期: 2 第二章 2.13...
第二章练习习题参考解答
欢迎共阅 第二章练习题参考解答 2.1 表 2.9 中是 1992 年亚洲各国人均寿命(Y)、按购买力平价计算的人均 GDP(X1)、成人识字 率(X2)、一岁儿童疫苗接种......
课后习题参考解答
课后习题参考解答_英语考试_外语学习_教育专区。课后习题解答 第一章 课后习题 、选择题 1、数据库系统的核心是( A ) A、数据库管理系统 B、数据库 ( C )......
光纤通信课后习题解答 第2章习题参考答案
光纤通信课后习题解答 第2章习题参考答案_信息与通信_工程科技_专业资料。第二章...