–1/8 = – 0.125 = – 0.001B = – 0.100000 × 4–1,阶码为 –1 + 16 = 15 = 01111B,尾数为– 0.100000的补码,即1.100000,所以–1/8表示为1 01111 100000。
(2)该格式浮点数表示的范围如下。 正数最大值:0.111111B × 411111,即:0.333× 415 (≈230 ≈109) 正数最小值:0.000001B × 400000,即:0.001× 4–16 (≈2–34≈10–10) 负数最大值:–0.000001B × 400000,即:–0.001× 4–16 负数最小值:–1.000000B × 411111,即:–1.000× 415 因此,该格式浮点数的数量级在10–10~109之间。
12位定点补码整数的表示范围为:–211~+(211–1),即:–2048~2047 由此可见,定点数和浮点数的表示范围相差非常大。
11. 下列几种情况所能表示的数的范围是什么?
(1) 16位无符号整数 (2) 16位原码定点小数 (3) 16位补码定点小数 (4) 16位补码定点整数
(5) 下述格式的浮点数(基数为2,移码的偏置常数为128)
数符 尾数 阶码
1位 8位移码 7位原码
参考答案:
(1)无符号整数:0~216–1。
(2)原码定点小数:–(1–2–15) ~ + (1–2–15)。 (3)补码定点小数:–1 ~ + (1–2–15)。 (4)补码定点整数:–32768 ~ +32767。 (5)浮点数:负数:– (1–2–7)×2+127 ~ –2–7×2–128。
正数:+2–135 ~ (1–2–7) ×2+127。
12. 以IEEE 754单精度浮点数格式表示下列十进制数。
+1.75,+19,–1/8,258 参考答案: +1.75 = +1.11B = 1.11B × 20, 故阶码为0+127=01111111B, 数符为0,尾数为1.110…0,小数点前为隐藏位,所以+1.7表示为0 01111111 110 0000 0000 0000 0000 0000,用十六进制表示为3FE00000H。 +19 = +10011B = +1.0011B × 24,故阶码为4+127 = 10000011B, 数符为0,尾数为1.00110…0,所以+19表示为0 10000011 001 1000 0000 0000 0000 0000,用十六进制表示为41980000H。 –1/8 = – 0.125 = – 0.001B = – 1.0 × 2–3,阶码为–3+127 = 01111100B,数符为1,尾数为1.0…0,所以–1/8表示为1 01111100 000 0000 0000 0000 0000 0000,用十六进制表示为BE000000H。
258=100000010B=1.0000001B × 28, 故阶码为8+127=10000111B, 数符为0,尾数为1.0000001,所以258表示为0 10000111 000 0001 0000 0000 0000 0000,用十六进制表示为43810000H。
13.设一个变量的值为4098,要求分别用32位补码整数和IEEE 754单精度浮点格式表示该变量(结果
用十六进制表示),并说明哪段二进制序列在两种表示中完全相同,为什么会相同? 参考答案:
4098 = +1 0000 0000 0010B = +1. 0000 0000 001 × 212
32位2-补码形式为:0000 0000 0000 0000 0001 0000 0000 0010 (00001002H) IEEE754单精度格式为:0 10001011 0000 0000 0010 0000 0000 000 (45801000H) 粗体部分为除隐藏位外的有效数字,因此,在两种表示中是相同的序列。
14.设一个变量的值为–2147483647,要求分别用32位补码整数和IEEE754单精度浮点格式表示该变量(结果用十六进制表示),并说明哪种表示其值完全精确,哪种表示的是近似值。 参考答案:
–2147483647 = –111 1111 1111 1111 1111 1111 1111 1111B
= –1.11 1111 1111 1111 1111 1111 1111 1111 × 230
32位2-补码形式为:1000 0000 0000 0000 0000 0000 0000 0001 (80000001H) IEEE 754单精度格式为:1 10011101 1111 1111 1111 1111 1111 111 (CEFFFFFFH) 32位2-补码形式能表示精确的值,而浮点数表示的是近似值,低位被截断
15.下表给出了有关IEEE 754浮点格式表示中一些重要数据的取值,表中已经有最大规格化数的相应内
容,要求填入其他浮点数的相应内容。(注:表中a代表一个在1到10之间的正纯小数) 单精度 项目 阶码 尾数 以2的幂次表示的值 0 1 最大规格化数 最小规格化数 最大非规格化数 最小非规格化数 +∞ NaN
双精度 以2的幂次表示的值 0 1 (2–2–52)×21023 1.0×2–1022 (1–2–52)×2–1022 2–52×2–1022 – – 以10的幂次表示的值 0 1 a×10308 a×10–308 a×10–308 a×10–? – – 以10的幂次表示的值 0 1 a×1038 a×10–38 a×10–38 a×10–44 – – 00000000 01111111 11111110 00000001 00000000 00000000 11111111 11111111 0….00 0….00 1…11 0….00 1…11 0…01 0….00 非全0 0 1 (2–2–23)×2127 1.0×2–126 (1–2–23)×2–126 2–23×2–126=2–149 – –
16.已知下列字符编码:A=100 0001,a=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 = 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 = 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 = –0.125、y=7.5、i=100,它们都被写到了主存(按字节编址),其地址分别是100,108和112。请分别画出在大端机器和小端机器上变量x、y和i在内存的存放位置。 参考答案:
–0.125 = –0.001B = –1.0 × 2-3
x在机器内部的机器数为:1 01111100 00…0 (BE00 0000H) 7.5= +111.1B= +1.111 × 22
y在机器内部的机器数为:0 10000001 11100…0 (40F0 0000H) 100=64+32+4=1100100B
i在机器内部表示的机器数为:0000 0000 0110 0100(0064H)
大端机 小端机
地址 内容 内容 100 BEH 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 18.假定某计算机的总线采用奇校验,每8位数据有一位校验位,若在32位数据线上传输的信息是8F 3C
AB 96H,则对应的4个校验位应为什么?若接受方收到的数据信息和校验位分别为87 3C AB 96H和0101B,则说明发生了什么情况,并给出验证过程。 参考答案:
传输信息8F 3C AB 96H展开为1000 1111 0011 1100 1010 1011 1001 0110,每8位有一个奇校验位,
因此,总线上发送方送出的4个校验位应该分别为0、1、0、1。
接受方的数据信息为87 3C AB 96H,展开后为1000 0111 0011 1100 1010 1011 1001 0110;接收到的
校验位分别为0、1、0、1。在接受方进行校验判断如下:
根据接收到的数据信息计算出4个奇校验位分别为1、1、0、1,将该4位校验位分别和接收到的4
位校验位进行异或,得到1、0、0、0,说明数据信息的第一个字节发生传输错误。对照传输前、后的数据信息,第一字节8FH变成了87H,说明确实发生了传输错误,验证正确。
19.写出16位数据的SEC码。假定数据为0101 0001 0100 0110,说明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 = M1⊕M2⊕M3⊕M4⊕M5⊕M7⊕M9⊕M11⊕M12⊕M14⊕M16 = 1 P2 = M1⊕M3⊕M4⊕M6⊕M7⊕M10⊕M11⊕M13⊕M14 = 1 P3 = M2⊕M3⊕M4⊕M8⊕M9⊕M10⊕M11⊕M15⊕M16 = 0 P4 = M5⊕M6⊕M7⊕M8⊕M9⊕M10⊕M11 = 0 P5 = M12⊕M13⊕M14⊕M15⊕M16 = 0 所以此时P5 P4 P3 P2 P1 = 00011,第五位数据出错时,数据字变为:0101 0001 0101 0110,P5’P4’P3’P2’P1’= 01010,故障字 = 00011⊕01010 = 01001,说明码字第9位出错,即M5出错。
20.假设要传送的数据信息为:100011,若约定的生成多项式为:G(x)= x3+1,则校验码为多少?假定在
接收端接收到的数据信息为100010,说明如何正确检测其错误,写出检测过程。 参考答案:
原数据信息为100011,对应的报文多项式为M(x) = x5 + x + 1, 生成多项式的位数为4位, 所以在原数据信息后面添加3个0,变为M’(x) = x3M(x) = x8 + x4 + x3, 用M(x)去模2除G(x),得到的余数为111, 所以得到CRC码为100011 111。 检测时, 用接收到的CRC码去模2除生成多项式1001,若得到的余数为0,则表明正确,否则说
明传输时发生了错误。此题中接收到的CRC码为100010 111(即数据100010加检验位111),显然,用100010 111 模2除 1001,得到余数为001,不为0,说明传输时发生错误。
第 3 章 习 题 答 案
2(4)高级语言中的运算和机器语言(即指令)中的运算是什么关系?假定某一个高级语言源程序P中有乘、除运算,但机器M中不提供乘、除运算指令,则程序P能否在机器M上运行?为什么? 参考答案:(略)
3.考虑以下C语言程序代码:
int func1(unsigned word) { return (int) (( word <<24) >> 24); }
int func2(unsigned word) { return ( (int) word <<24 ) >> 24; }
假设在一个32位机器上执行这些函数,该机器使用二进制补码表示带符号整数。无符号数采用逻辑移位,带符号整数采用算术移位。请填写下表,并说明函数func1和func2的功能。 W 机器数 值 func1(w) 机器数 值 func2(w) 机器数 值 0000 007FH 0000 0080H 0000 00FFH 0000 0100H 127 128 255 256 0000 007FH 0000 0080H 0000 00FFH 0000 0000H +127 +128 +255 0 0000 007FH FFFF FF80H FFFF FFFFH 0000 0000H +127 –128 –1 0 函数func1的功能是把无符号数高24位清零(左移24位再逻辑右移24位),结果一定是正的有符号数;而函数func2的功能是把无符号数的高24位都变成和第25位一样,因为左移24位后进行算术右移,高24位补符号位(即第25位)。
4.填写下表,注意对比无符号数和带符号整数的乘法结果,以及截断操作前、后的结果。 模式 无符号数 二进制补码 无符号数 二进制补码 无符号数 二进制补码 x 机器数 110 110 001 001 111 111 值 6 –2 1 +1 7 –1 机器数 010 010 111 111 111 111 y 值 2 +2 7 –1 7 –1 x×y(截断前) 机器数 001100 111100 000111 111111 110001 000001 值 12 –4 7 –1 49 +1 x×y(截断后) 机器数 100 100 111 111 001 001 值 4 –4 7 –1 1 +1
5.以下是两段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;
参考答案:
可以看出x*M和“int t = x; x << = 4; x-=t;”三句对应,这些语句实现了x乘15的功能(左移4位相当于乘以16,然后再减1),因此,M等于15;
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/4=0,两者不等;调整后 –1+3=2,2>>2=0,两者相等。