(完整word版)《计算机组成原理》课后题答案清华大学出版秦磊华吴非·· 下载本文

内容发布更新时间 : 2024/11/15 1:45:55星期一 下面是文章的全部内容请认真阅读。

答:采用补码运算具有如下两个特征:

(1)因为使用补码可以将符号位和其他位统一处理,同时,减法也可以按加法来处理,即如果是补码表示的数,不管是加减法都直接用加法运算即可实现。

(2)两个用补码表示的数相加时,如果最高位(符号位)有进位,则进位被舍弃。 这样的运算有两个好处:

(a)使符号位能与有效值部分一起参加运算,从而简化运算规则。从而可以简化运算器的结构,提高运算速度;(减法运算可以用加法运算表示出来。)

(b)加法运算比减法运算更易于实现。使减法运算转换为加法运算,进一步简化计算机中运算器的线路设计。

3)浮点数的表示范围和精确度分别由什么决定?字长一定时浮点数的表示范围与精确度之间有和关系?

答:浮点数的表示范围由阶码的位数决定,精确度由尾数的位数决定。

当机器字长一定时,分给阶码的位数越多,尾数占用的位数就越少,则数的表示范围越大。而尾数占用的位数减少,必然会减少数的有效数位,即影响数的精度。

4)汉字输入码、机内码和字型码在汉字处理过程中各有何作用?

答:汉字输入码、机内码和字型码,分别用于汉字的输入、汉字在计算机内的处理以及汉字的显示和打印。

具体来说,计算机要对汉字信息进行处理,首先要将汉字转换成计算机可以识别的二进制形式并输入到计算机,这是由汉字输入码完成的;汉字输入到计算机后,还需要转换成内码才能被计算机处理,显然,汉字内码也应该是二进制形式。如果需要显示和打印汉字,还要将汉字的内码转换成字形码。

5)在机内码中如何区分两个ASCII码字符和一个汉字? 答:将一个汉字看成是两个扩展ASCII码,使表示GB2312汉字的两个字节的最高位都为1,而每个ASCII码字符中每个字节的最高位为0。这样就能区别一个机内码到底对应一个汉字还是两个西文字符。

6)“8421码就是二进制数”。这种说法对吗?为什么?

答:这种说法是不对的。8421码是一种最简单的有权码,它选取4位二进制数的前10个代码0000~1001分别对应表示十进制数的10个数码。若按权求和,和数就等于该代码所对应的十进制数。

8421码是一种编码方式,用于十进位制与二进制数之间的转换。

而二进制数是用0和1两个数码来表示的数。二者是不同的概念,不能等同。

7)如何识别浮点数的正负?浮点数能表示的数值范围和数值的精确度取决于什么?

答:当采用一般浮点数格式表示浮点数时,阶码和尾数都各包含一位符号位。浮点数的正负由尾数的的符号位决定。当采用IEEE754格式时,通过数符就能判断出浮点数的正负。

浮点数能表示的数值范围和数值的精确度,分别取决于阶码的位数和尾数的位数。

8)简述CRC的纠错原理。

答:发送部件将某信息的CRC码传送至接收部件,接收部件收到CRC码后,仍用约定的生成多项式G(x)去除,若余数为0,表示传送正确;若余数不为0,表示出错,再由余数的值来

确定哪一位出错,从而加以纠正。具体的纠错原理如下:

(1)不论错误出现在哪一位,均要通过将出错位循环左移到最左边的一位上时被纠正; (2)不为零余数的具有循环特性。即在余数后面补一个零除以生成多项目式,将得到下一个余数,继续在新余数基础上补零除以生成多项式,继续该操作,余数最后能循环到最开始的余数。

(3)CRC就是利用不为零余数的循环特性,在循环计算余数的同时,将收到的CRC编码同步移动,当余数循环到等于最左边位出错对应的余数时,表明已将出错的位移到CRC码的最左边,对出错位进行纠错。

(4)继续进行余数的循环计算,并同步移动CRC编码,当余数又回到最开始的值时,纠错后的CRC码又回到了最开始的位置。至此,完成CRC的纠错任务。

2.3 写出下列各数的原码、反码和补码。 0, 一0, 0.10101, 一0.10101, 0.11111, 一0.11111, -0.10000, 0.10000 解:

x=0,则[+0]原 = 0.00…0 , [+0 ]反= 0.00…0,[+0]补 =0.00…0; x=-0,则[-0]原 = 1.00…0,[-0]反 = 1.11…l,[-0]补 = 0.00…0; x=0.10101,则[x]原 =0.10101,[x]反 =0.10101,[x]补 =0.10101; x=一0.10101,则[x]原 =1.10101,[x]反 =1.01010,[x]补 =1.01011; x=0.11111,则[x]原 =0.11111,[x]反 =0.00000,[x]补 =0.00001; x=一0.11111,则[x]原 =1.11111,[x]反 =1.00000,[x]补 =1.00001; x=-0.10000,则[x]原 =1.10000,[x]反 =1.01111,[x]补 =1.10000; x=0.10000,则[x]原 =0.10000,[x]反 =0.10000,[x]补 =0.10000。

2.4 已知数的补码表示形式,求数的真值。 [x]补=0.10010, [x]补=1.10010, [x]补=1.11111, [x]补=1.00000, [x]补=0.10001, [x]补=1.00001, 解:

[x]补=0.10010,则[x]原=0.10010,x=0.10010; [x]补=1.10010,则[x]原=1.01101,x=-0.01101; [x]补=1.11111,则[x]原=1.00000,x=-0; [x]补=1.00000,则[x]原=1.11111,x=-0.11111; [x]补=0.10001,则[x]原=0.10001,x=0.10001; [x]补=1.00001,则[x]原=1.11110,x=-0.11110。

2.5 已知x=0.10110,y=—0.01010,求:

[x/2]补, [x/4]补, [y/2]补, [2y]补

解: [x]原=0.10110=[x]反=[x]补,

所以[x/2]补=0.010110,[x/4]补=0.0010110; [y]原=1.01010,[y]反=1.10101,[y]补=1.10110, 所以[y/2]补=1.110110,[2y]补=1.0110。

2.6 C语言中允许无符号数和有符号整数之间的转换, 下面是一段C语言代码: Int x =-1;

Unsigned u=2147483648;

Printf (“x=%u=%d\\n”,x,x); Printf (“u=%u=%d\\n”,u,u);

给出在32位计算机中上述程序段的输出结果并分析原因. 解:x=4294967295=-1;u=2147483648=-2147483648

原因:x是int型,在计算机中以补码形式存在。%u以无符号输出,%d输出真值,所以x=4294967295=-1。

u=231是一个无符号数,无溢出,由于首位为1

%u符号输出第一位为非符号位,所以是2147483648

%d 第一位为符号位,所以是负数,取反加1还是231所以是-2147483648。 2.7 分析下列几种情况下所能表示的数据范围分别是多少 1)16位无符号数; 2)16位原码定点小数; 3)16位补码定点小数; 4) 16位补码定点整数; 解: 1)16位无符号数:0 ~ 1111 1111 1111 1111,即0 ~ 216-1=65535 2)16位原码定点小数:1.111 1111 1111 1111 ~ 0.111 1111 1111 1111,即 -(1-2-15)~ 1-2-15 3)16位补码定点小数:1.000 0000 0000 0000 ~ 0.111 1111 1111 1111,即 -1 ~ 1-2-15 4) 16位补码定点整数:1000 0000 0000 0000 ~ 0111 1111 1111 1111,即 -215 ~ 215-1 2.8 用补码表示8位二进制整数,最高位用一位表示符号(即形如x0x1x2x3x4x5x6x7)时,模应为多少? 解:因为8位二进制数补码的表示范围为:-128~127一共有256个数,所以模为256。 2.9 用IEEE754 32位浮点数标准表示十进制数 a)?65 b)3.1415927 c)64000 8解: a) 首先分别将整数和分数部分转换成二进制数: 5?6=-110.101 8移动小数点,使其变成1.M的形式: -110.101=-1.10101*22 于是得到: S=0, e = 2,E= 10+01111111 = 10000001,M = 10101 最后得到32位浮点数的二进制存储格式为:

1100 0000 1101 0100 0000 0000 0000 0000=(C0D40000)16

b) 首先分别将整数和分数部分转换成二进制数: 3.1415927=11.00100100001111110110101 移动小数点,使其变成1.M的形式

11.00100100001111110110101=1.100100100001111110110101×2

于是得到:

S=0, e = 1,E= 1+01111111 =10000000,M = 10010010000111111011010 最后得到32位浮点数的二进制存储格式为:

0100 0000 0100 1001 0000 1111 1101 1010=(40490FDA)16

c) 首先将6400转换成二进制数: 64000=1100100000000

移动小数点,使其变成1.M的形式 1100100000000=1.100100000000×212 于是得到: S=0, e = 12,E= 1100+01111111 =10001011,M = 1001 最后得到32位浮点数的二进制存储格式为: 0100 0101 1100 1000 0000 0000 0000 0000=(45C80000) 16 2.10 求与IEEE754 32位浮点数43940000H对应的十进制数。 解: 43940000H=(0100 0011 1001 0100 0000 0000 0000 0000)2 S=0,E=(10000111)2-127=8,M=1.00101 所以表示数为100101000,对应的十进制数为296。 2.11 求32位 IEEE754 浮点数能表示的最大数和最小数。 解:用IEEE754格式(E的取值范围:1~254,留出全0和全1分别表示0和无穷大) 31 30 23 22 0 S E M (1) 最大数的二进制表示: 0 11111110 11111111111111111111111 即 2(2-2) (2) 最小数的二进制表示: 1 11111110 11111111111111111111111 即 - 2(2-2) 2.12 设有两个正浮点数:N1=2m×M1,N2=2n×M2。 (1)若m>n,是否有N1>N2? (2)若M1和M2是规格化的数,上述结论是否正确? 解:(1)不一定。 例如,N1=23×0.001,N2=22×0.01,此时m>n,却有N1=N2。 再如,N1=23×0.001,N2=22×0.1,此时m>n,却有N1<N2。 (2)正确。

因为浮点数规格化,要求尾数的最高位为非0数码,即当尾数的值不为零时,其绝对值应大于或等于(1/2)10。

那么M1和M2都必须是0.1× × … ×的形式。这时,若m>n,则一定有N1>N2。

2.13 设二进制浮点数的阶码为3位,尾数是7位。用模2补码写出它们所能表示的最大正

127-23127-23

数、最小正数、最大负数和最小负数,并将它们转换成十进制数。 解: 补码 真值

3-6

最大正数: 011;0.111111, 2×(1-2)

3-6

最小正数: 101;0.000001, 2×2

3-6

最大负数: 101;1.111111, -2×2

3-6

最小负数: 011;1.000000, -2×(1-2)

2.14 将下列十进制数表示成浮点规格化数,阶码4位,尾数10位,各含1位符号,阶码和

尾数均用补码表示。

(1)57/128 (2) —69/128 解:(1)57/128=(0.0111001)2,记x=0.0111001,则[x]原=[x]反=[x]补=0.0111001, 规格化:[x]补=0.111001*2-1

阶码的原码为:1001,因此补码为:1111 尾数为:0111001000

表示成浮点规格化数:1111 0111001000

(2)-69/128=(-0.1000101)2,记x=-0.1000101,则[x]原=1.1000101,[x]反=1.0111010,[x]补=1.0111011,

无需规格化,阶码为0000,尾数为1011101100 表示成浮点规格化数:0000 1011101100

2.15 设有效信息为01011011,分别写出奇校验码和偶校验码。如果接收方收到的有效信息为01011010,说明如何发现错误。 解:奇偶校验位分别为:0和1, 奇校验码:010110110 偶校验码:010110111 如果采用奇校验,则发送方发出的奇校验码x=010110110(前8位是有效信息位,最后一位是校验位), 如果接收方收到的x=010110100 (只有1位出错,最后一个0是校验位), 接收方按奇校验方式根据01011010计算得到的验位C’=1 ,与从信息中读到得校验码的取值不同,表明传送的信息发生了错误。

如果采用偶校验,利用相似的方法可以发现错误。

2.16由 6 个字符的 7 位 ASCII 编码排列,再加上水平和垂直偶校验位构成如表2.23的行列结构(最后一列为水平奇偶校验位,最后一行为垂直奇偶校验位)

表2.23 ASCII码交叉校验

字符

7 位 ASCII 码

1 X3 1 1 X8

HP 0 1 0 1 0

3 0 X1 X2 0 0 1 Y1 1 0 0 1 0 0 + X4 1 0 1 0 1 Y2 0 1 X5 X6 1 1 D 1 0 0 X7 1 0