1、第 二 章 习 题 答 案2(1)为什么计算机内部采用二进制表示信息?既然计算机内部所有信息都用二进制表示,为什么还要用到十六进制和八进制数?参考答案:(略)2(7)为什么计算机处理汉字时会涉及到不同的编码(如,输入码、内码、字模码)?说明这些编码中哪些是用二进制编码,哪些不是用二进制编码,为什么?参考答案:(略)3实现下列各数的转换。(1) (25.8125)10= (?)2= (?) 8= (?) 16(2) (101101.011)2 = (?)10= (?) 8= (?) 16= (?) 8421(3) (0101 1001 0110.0011)8421 = (?)10= (?) 2=
2、 (?) 16(4) (4E.C)16 = (?)10= (?) 2参考答案:(1) (25.8125)10 = (1 1001.1101)2 = (31.64) 8 = (19.D) 16(2)(101101.011) 2 = (45.375)10 = (55.3) 8 = (2D.6) 16 = (0100 0101.0011 0111 0101) 8421(3)(0101 1001 0110.0011)8421 = (596.3)10 = (1001010100.01001100110011) 2 = (254.4CCC) 16(4)(4E.C) 16 = (78.75)10 = (01
3、00 1110.11) 24 假定机器数为 8 位(1 位符号, 7 位数值) ,写出下列各二进制数的原码和补码表示。+0.1001,0.1001,+1.0 , 1.0,+0.010100 ,0.010100,+0,0参考答案:(后面添 0)原码 补码+0.1001: 0.1001000 0.10010000.1001: 1.1001000 1.0111000+1.0: 溢出 溢出1.0: 溢出 1.0000000+0.010100: 0.0101000 0.01010000.010100: 1.0101000 1.1011000+0: 0.0000000 0.00000000: 1.0000
4、000 0.00000005 假定机器数为 8 位(1 位符号, 7 位数值) ,写出下列各二进制数的补码和移码表示。+1001, 1001,+1 , 1,+10100,10100,+0, 0参考答案:(前面添 0) 移码 补码+1001: 10001001 000010011001: 01110111 11110111+1: 10000001 000000011: 011111111 11111111+10100: 10010100 0001010010100: 01101100 11101100+0: 10000000 000000000: 10000000 000000006 已知 x补
5、 ,求 x(1)x 补 =1.1100111 (2 )x 补 =10000000(3)x 补 =0.1010010 (4 )x 补 =11010011参考答案:(1)x 补 =1.1100111 x = 0.0011001B(2)x 补 =10000000 x = 10000000B = 128(3)x 补 =0.1010010 x = +0.101001B(4)x 补 =11010011 x = 101101B = 457假定一台 32 位字长的机器中带符号整数用补码表示,浮点数用 IEEE 754 标准表示,寄存器 R1 和R2 的内容分别为 R1:0000 017AH,R2:FFFF F
6、895H。不同指令对寄存器进行不同的操作,因而,不同指令执行时寄存器内容对应的真值不同。假定执行下列运算指令时,操作数为寄存器 R1和 R2 的内容,则 R1 和 R2 中操作数的真值分别为多少?(1) 无符号数加法指令(2) 带符号整数乘法指令(3) 单精度浮点数减法指令参考答案:R1 = 0000 017AH = 0000 0000 0000 0000 0000 0001 0111 1010R2 = FFFF F895H = 1111 1111 1111 1111 1111 1000 1001 0101(1)对于无符号数加法指令,R1 和 R2 中是操作数的无符号数表示,因此,其真值分别为
7、R1:17AH, R2:FFFF F895H。 (对应十进制分别为 378、4 294 965 397=232 1899)(2)对于带符号整数乘法指令,R1 和 R2 中是操作数的带符号整数补码表示,由最高位可知, R1 为正数, R2 为负数。R1 的真值为+17AH=378, R2 的真值为 111 0110 1011= 1899。(3)R1:符号位为 0,表示其为正数,阶码为 0000 0000,尾数部分为 000 0000 0000 0001 0111 1010,故其为非规格化浮点数,指数为 126,尾数中没有隐藏的 1,用十六进制表示尾数为+0.0000 0000 0000 0010
8、 1111 0100=+0.0002F4H,故 R1 表示的真值为+0.0002F4H 2-126。R2: 符号位为 1,表示其为负数,阶码为 1111 1111,尾数部分为 111 1111 1111 1000 1001 0101,故其为全 1 阶码非 0 尾数,即是一个非数 NaN。8假定机器 M 的字长为 32 位,用补码表示带符号整数。下表第一列给出了在机器 M 上执行的 C 语言程序中的关系表达式,请参照已有的表栏内容完成表中后三栏内容的填写。关系表达式 类型 结果 说明0 = 0U1 2147483647 12147483647U 2147483647 12147483647 (i
9、nt) 2147483648U1 2(unsigned) 1 2无有无有无有有无11010 111000B = 000B111B (1) 000B(0)0111B (2311) 1000B (231)0111B (2311) 1000B (231)111B (1) 1110B (2)111B (2321) 1110B (2322)9以下是一个 C 语言程序,用来计算一个数组 a 中每个元素的和。当参数 len 为 0 时,返回值应该是0,但是在机器上执行时,却发生了存储器访问异常。请问这是什么原因造成的,并说明程序应该如何修改。1 float sum_elements(float a, uns
10、igned len)2 3 int i;4 float result = 0;56 for (i = 0; i = len1; i+)7 result += ai;8 return result;9 参考答案:参数 len 的类型是 unsigned,所以,当 len=0 时,执行 len-1 的结果为 111,是最大可表示的无符号数,因而,任何无符号数都比它小,使得循环体被不断执行,引起数组元素的访问越界,发生存储器访问异常。只要将 len 声明为 int 型,或循环的测试条件改为 ilen。10. 设某浮点数格式为:其中,移码的偏置常数为 16,补码采用一位符号位,基数为 4。(1) 用这
11、种格式表示下列十进制数:+1.75,+19,1/8。(2) 写出该格式浮点数的表示范围,并与 12 位定点补码整数表示范围比较。参考答案:(假定采用 0 舍 1 入法进行舍入)(1) +1.75 = +1.11B = 0.011100B 41, 故阶码为 1 +16 = 17 = 10001B, 尾数为+0.011100 的补码, = 1.1100B 40 =0。 130Q 41 =1.30Q 40 即 0.011100,所以+1.75 表示为 0 10001 011100。+19 = +10011B = 0.010011B 43,故阶码为 3 + 16 = 19 = 10011B, 尾数为
12、0.010011,所以+19 表示为 0 10011 010011。1/8 = 0.125 = 0.001B = 0.100000 41,阶码为 1 + 16 = 15 = 01111B,尾数为 0.100000 的补码,即 1.100000,所以1/8 表示为 1 01111 100000。(2)该格式浮点数表示的范围如下。正数最大值:0.111111B 411111,即:0.333 415 (2 30 109)正数最小值:0.000001B 400000,即:0.001Q 416 (2 341010)负数最大值:0.000001B 400000,即:0.001 416负数最小值:1.000
13、000B 411111,即:1.000 415数符S1阶码S1尾数S15 位移码S16 位补码数值S11位S1因此,该格式浮点数的数量级在 101010 9 之间。12 位定点补码整数的表示范围为:2 11+(2 111),即:20482047由此可见,定点数和浮点数的表示范围相差非常大。11. 下列几种情况所能表示的数的范围是什么?(1) 16 位无符号整数(2) 16 位原码定点小数(3) 16 位补码定点小数(4) 16 位补码定点整数(5) 下述格式的浮点数(基数为 2,移码的偏置常数为 128)参考答案:(1)无符号整数:0 2 161。(2)原码定点小数: (1215) + (12
14、15)。(3)补码定点小数: 1 + (1215)。(4)补码定点整数: 32768 +32767。(5)浮点数:负数: (127)2+127 272128。正数:+2 135 (127) 2+127。12. 以 IEEE 754 单精度浮点数格式表示下列十进制数。+1.75,+19, 1/8,258参考答案:+1.75 = +1.11B = 1.11B 20, 故阶码为 0+127=01111111B, 数符为 0,尾数为 1.1100,小数点前为隐藏位,所以+1.7 表示为 0 01111111 110 0000 0000 0000 0000 0000,用十六进制表示为3FE00000H。
15、+19 = +10011B = +1.0011B 24,故阶码为 4+127 = 10000011B, 数符为 0,尾数为1.001100,所以+19 表示为 0 10000011 001 1000 0000 0000 0000 0000,用十六进制表示为41980000H。1/8 = 0.125 = 0.001B = 1.0 23,阶码为3+127 = 01111100B,数符为 1,尾数为1.00,所以1/8 表示为 1 01111100 000 0000 0000 0000 0000 0000,用十六进制表示为BE000000H。258=100000010B=1.0000001B 28,
16、 故阶码为 8+127=10000111B, 数符为 0,尾数为1.0000001,所以 258 表示为 0 10000111 000 0001 0000 0000 0000 0000,用十六进制表示为43810000H。13设一个变量的值为 6144,要求分别用 32 位补码整数和 IEEE 754 单精度浮点格式表示该变量(结果用十六进制表示) ,并说明哪段二进制序列在两种表示中完全相同,为什么会相同?参考答案:6144 = +1 1000 0000 0000B = +1. 1 212数符S1阶码S1尾数S11 位S18 位移码S17 位原码S132 位补码形式为:0000 0000 00
17、00 0000 0001 1000 0000 0000 (00001800H)IEEE754 单精度格式为:0 10001011 100 0000 0000 0000 0000 0000 (45C0 0000H)蓝字部分为除隐藏位外的有效数字,因此,在两种表示中是相同的序列。因为正数的补码和原码是一致的,所以除隐藏位外的有效数字都相同。14设一个变量的值为6144,要求分别用 32 位补码整数和 IEEE754 单精度浮点格式表示该变量(结果用十六进制表示) ,并说明哪种表示其值完全精确,哪种表示的是近似值。参考答案:6144 = 1 1000 0000 0000B = 1. 1 21232
18、位补码形式为:1111 1111 1111 1111 1110 1000 0000 0000 (FFFF E800H)IEEE 754 单精度格式为:1 10001011 100 0000 0000 0000 0000 0000 (C5C0 0000H)32 位补码形式能表示精确的值,浮点数表示的也是精确值,因为没有有效数字被截断。15下表给出了有关 IEEE 754 浮点格式表示中一些重要数据的取值,表中已经有最大规格化数的相应内容,要求填入其他浮点数的相应内容。 (注:表中 a 代表一个在 1 到 10 之间的正纯小数)单精度 双精度项目 阶码 尾数 以 2 的幂次表示的值以 10 的幂次
19、表示的值以 2 的幂次表示的值以 10 的幂次表示的值01最大规格化数最小规格化数最大非规化数最小非规化数+NaN00000000011111111111111000000001000000000000000011111111111111110.000.001110.001110010.00非全 001(2223)21271.02126(1223)21262232126=214901a1038a1038a1038a104401(2252)210231.021022(1252)210222522102201a10308a10308a10308a10?16已知下列字符编码:A=100 0001,a
20、=110 0001,0=011 0000,求 E、e、f、7、G、Z、5 的 7 位ACSII 码和第一位前加入奇校验位后的 8 位编码。参考答案:E 的 ASCII 码为 A + (E A) = 100 0001 + 100 = 100 0101, 奇校验位 P = 0,第一位前加入奇校验位后的 8 位编码是 0 100 0101。e 的 ASCII 码为a+ (e a) = 110 0001 + 100 = 110 0101, 奇校验位 P = 1, 第一位前加入奇校验位后的 8 位编码是 1 110 0101。f 的 ASCII 码为a+ (f a) = 110 0001 + 101 =
21、 110 0110, 奇校验位 P = 1, 第一位前 加入奇校验位后的 8 位编码是 1 110 0110。7 的 ASCII 码为0+ (7 - 0) = 011 0000 + 111 = 011 0111,奇校验位 P = 0, 第一位前加入奇校验位后的 8 位编码是 0 011 0111。G 的 ASCII 码为A+ (G A) = 100 0001 + 0110 = 100 0111, 奇校验位 P = 1, 第一位前加入奇校验位后的 8 位编码是 1 100 0111。Z 的 ASCII 码为A+(Z A) = 100 0001 + 11001 = 101 1010, 奇校验位 P
22、 = 1, 第一位前加入奇校验位后的 8 位编码是 1 101 1010。5 的 ASCII 码为0+(5 0) = 011 0000 + 101 = 011 0101, 奇校验位 P = 1, 第一位前加入奇校验位后的 8 位编码是 1 011 0101。17假定在一个程序中定义了变量 x、y 和 i,其中,x 和 y 是 float 型变量(用 IEEE754 单精度浮点数表示) ,i 是 16 位 short 型变量(用补码表示) 。程序执行到某一时刻,x = 10.125、y=12、i= 125,它们都被写到了主存(按字节编址) ,其地址分别是 100,108 和112。请分别画出在大
23、端机器和小端机器上变量 x、y 和 i 在内存的存放位置。参考答案:10.125 = 1010.001B = 1.010001 23x 在机器内部的机器数为:1 10000010 01000100 (C122 0000H)12= +1100B= +1.1 23y 在机器内部的机器数为:0 10000010 1000 (4140 0000H)125=111 1101Bi 在机器内部的机器数为:1111 1111 1000 0011(FF83H)大端机 小端机地址 内容 内容100 C1H 00H101 22H 00H102 00H 22H103 00H C1H108 41H 00H109 40H
24、 00H110 00H 40H111 00H 41H112 FFH 83H113 83H FFH18假定某计算机的总线采用偶校验,每 8 位数据有一位校验位,若在 32 位数据线上传输的信息是 8F 3C AB 96H,则对应的 4 个校验位应为什么?若接受方收到的数据信息和校验位分别为 87 3C AB 96H 和 1010B,则说明发生了什么情况,并给出验证过程。参考答案:传输信息 8F 3C AB 96H 展开为 1000 1111 0011 1100 1010 1011 1001 0110,每 8 位有一个偶校验位,因此,总线上发送方送出的 4 个校验位应该分别为 1、0、1、0 。接
25、受方的数据信息为 87 3C AB 96H,展开后为 1000 0111 0011 1100 1010 1011 1001 0110,接收到的校验位分别为 1、0、1 、0。在接受方进行校验判断如下:根据接收到的数据信息计算出 4 个偶校验位分别为 0、0、1、0 ,将该 4 位校验位分别和接收到的4 位校验位进行异或,得到 1、0 、0、0,说明数据信息的第一个字节发生传输错误。对照传输前、后的数据信息,第一字节 8FH 变成了 87H,说明确实发生了传输错误,验证正确。19假定一个 16 位数据 M16 M15 M14 M13 M12 M11 M10 M9 M8 M7 M6 M5 M4 M
26、3 M2 M1,写出 16 位数据的 SEC 码。假定数据为 0010 1000 1100 1010,说明 SEC 码如何正确检测数据位 5 的错误。参考答案:对于 16 位数据, 可以如下插入校验位:M16 M15 M14 M13 M12 P5 M11 M10 M9 M8 M7 M6 M5 P4 M4 M3 M2 P3 M1 P2 P1其中 Mi 是原信息数据, Pi 是加入的校验位, 对于各个校验位的值可以如下计算P1 = M1M2M4M5M7M9M11M12M14M16 = 1P2 = M1M3M4M6M7M10M11M13M14 = 1P3 = M2M3M4M8M9M10M11M15M
27、16 = 1P4 = M5M6M7M8M9M10M11 = 0P5 = M12M13M14M15M16 = 0所以此时 P5 P4 P3 P2 P1 = 00111,第五位数据出错时,数据字变为:0010 1000 1101 1010,P 5P4P3P2P1= 01110,故障字= 0011101110 = 01001,说明码字第 9 位出错,即 M5 出错。20假设要传送的数据信息为:110010,若约定的生成多项式为: G(x)= x3+1,则校验码为多少?假定在接收端接收到的数据信息为 110011,说明如何正确检测其错误,写出检测过程。参考答案:原数据信息为 110010,对应的报文多
28、项式为 M(x) = x5 + x4 + x, 生成多项式的位数为 4 位, 所以在原数据信息后面添加 3 个 0,变为 M(x) = x3M(x) = x8 + x7 + x4, 用 M(x)去模 2 除 G(x),得到的余数为 100, 所以得到 CRC 码为 110010 100。检测时,用接收到的 CRC 码去模 2 除生成多项式 1001,若得到的余数为 0,则表明正确,否则说明传输时发生了错误。此题中接收到的 CRC 码为 110011 100(即数据 110011 加检验位 100) ,显然,用 110011 100 模 2 除 1001,得到余数为 001,不为 0,说明传输时发生错误。在网络通信中,一般不纠错,只要求重发。