【分析解答】

第 3 版 · OCR 辅助 · 原书检索 · 文字用于定位,公式与图表请回原页核验 · 本次导入快照

## 【分析解答】

存储器访问异常是由于对数组 $a$ 访问时产生了越界或越权错误而造成的。循环变量 $i$ 是 int 型,而 len 是 unsigned 型,当 len 为 0 时,执行 len-1 的结果为 32 个 1,是最大可表示的 32 位无符号数,任何无符号数都比它小,使得循环体被不断执行,导致数组访问越界或越权,因而发生存储器访问异常。应当将参数 len 声明为 int 型。

10. 下列几种情况所能表示的数的范围是什么?

(1) 16 位无符号整数。
(2) 16 位原码定点小数。
(3) 16 位补码定点整数。
(4) 下述格式的浮点数(基数为 2,移码的偏置常数为 128,规格化尾数,不考虑隐藏位)。

[tbl-10.md](tbl-10.md)

## 【分析解答】

(1) 16 位无符号整数范围为 $0 \sim 2^{16} - 1$,即 $0 \sim 65535$。
(2) 16 位原码定点小数表示的范围为 $-(1 - 2^{-15}) \sim +(1 - 2^{-15})$。
(3) 16 位补码定点整数表示的范围为 $-2^{15} \sim + (2^{15} - 1)$,即 $-32768 \sim +32767$。
(4) 规格化浮点数的表示范围如下。

最大正数:$+0.11111111\mathrm{B} \times 2^{111111111\mathrm{B}} = +(1 - 2^{-7}) \times 2^{127}$。

最小正数:$+0.1000000\mathrm{B} \times 2^{00000000\mathrm{B}} = +2^{-1} \times 2^{-128} = +2^{-129}$。

最大负数:$-0.1000000\mathrm{B} \times 2^{00000000\mathrm{B}} = -2^{-1} \times 2^{-128} = -2^{-129}$。

最小负数:$-0.1111111\mathrm{B} \times 2^{11111111\mathrm{B}} = -(1 - 2^{-7}) \times 2^{127}$。

由于原码是关于原点对称的,所以,浮点数的表示范围是关于原点对称的。

对于非规格化浮点数,其最小正数和最大负数的尾数形式为 $\pm 0.0000001$,最小正数和最大负数的值为 $\pm 2^{-7} \times 2^{-128} = \pm 2^{-135}$。

11. 设某浮点数格式为

[tbl-11.md](tbl-11.md)

其中,移码的偏置常数为 16,补码采用一位符号位和 6 位数值位,基数为 4,规格化尾数,不考虑隐藏位。


<!-- page: 45 -->

(1) 用这种格式表示下列十进制数: +1.625, -0.125, +20, -9/16。
(2) 写出该格式浮点数的表示范围。

【分析解答】

(1) +1.625 = +1.1010B = (+0.122)₁ × 4³,故阶码为 1 + 16 = 17 = 10001B,尾数为四进制数 +0.122 的补码,即 0.01 10 10B,因此,+1.625 表示为 0 10001 011010。

-0.125 = -0.0010B = (-0.200)₁ × 4⁻³,故阶码为 -1 + 16 = 15 = 01111B,尾数为四进制数 -0.200 的补码,即 1.10 00 00B,因此,-0.125 表示为 1 01111 100000。

+20 = +10100B = (+0.110)₁ × 4³,故阶码为 3 + 16 = 19 = 10011B,尾数为四进制数 +0.110 的补码,即 0.01 01 00B,因此,+20 表示为 0 10011 010100。

-9/16 = -0.1001B = (-0.210)₁ × 4⁰,故阶码为 0 + 16 = 16 = 10000B,尾数为四进制数 -0.210 的补码,即 1.01 11 00B,因此,-9/16 表示为 1 10000 011100。

(2) 规格化浮点数的表示范围如下。

最大正数:+0.11 1111B × 4¹¹¹¹¹B = (+0.333)₁ × 4¹⁵。

最小正数:+0.01 0000B × 4⁰⁰⁰⁰⁰B = (+0.100)₁ × 4⁻¹⁶ = +4⁻¹⁷。

最大负数:-0.01 0000B × 4⁰⁰⁰⁰⁰B = (-0.100)₁ × 4⁻¹⁶ = -4⁻¹⁷。

最小负数:-1.00 0000B × 4¹¹¹¹¹B = (-1.000)₁ × 4¹⁵ = -4¹⁵。

由于补码表示的尾数不是关于原点对称的,所以,浮点数的表示范围不是相对于原点对称的。

12. 以 IEEE 754 单精度浮点数格式表示下列十进制数,要求将结果写成十六进制形式。

$$
+1.625, -0.125, +20, -9/16
$$

【分析解答】

+1.625 = +1.101B × 2⁰,所以,符号 s = 0,阶码 e = 0 + 127 = 0111 1111B,尾数的小数部分 f = 0.101B,因此,+1.625 用 IEEE 754 单精度浮点数格式表示为 0 011 1111 1 101 0000 0000 0000 0000 0000,用十六进制形式表示为 3FD0 0000H。

-0.125 = -0.001B = -1.0B × 2⁻³,所以,符号 s = 1,阶码 e = -3 + 127 = 0111 1100B,尾数的小数部分 f = 0.0B,因此,-0.125 用 IEEE 754 单精度浮点数格式表示为 1 011 1110 0 000 0000 0000 0000 0000 0000,用十六进制形式表示为 BE00 0000H。

+20 = +10100B = +1.01B × 2¹,所以,符号 s = 0,阶码 e = 4 + 127 = 1000 0011B,尾数的小数部分 f = 0.01B,因此,+20 用 IEEE 754 单精度浮点数格式表示为 0 100 0001 1 010 0000 0000 0000 0000 0000,用十六进制形式表示为 41A0 0000H。

-9/16 = -0.1001B = -1.001B × 2⁻¹,所以,符号 s = 1,阶码 e = -1 + 127 = 0111 1110B,尾数的小数部分 f = 0.001B,因此,-9/16 用 IEEE 754 单精度浮点数格式表示为 1 011 1111 0 001 0000 0000 0000 0000 0000,用十六进制形式表示为 BF10 0000H。

13. 假定一个 float 型变量 x 的机器数为 4510 0000H,则变量 x 的值是多少?

【分析解答】

float 型变量的机器数对应 IEEE 754 单精度浮点数格式,因此,将 4510 0000H 展开为


<!-- page: 46 -->

32 位机器数:

0 100 0101 0 001 0000 0000 0000 0000 0000 后,得到其符号位为 0;阶码为 1000 1010B,其阶(指数)为 1000 1010B−127 = 138−127 = 11;尾数的值为 1.001B = 1.125。因而 $x$ 的数值为 $+1.125 \times 2^{11} = 2304$。

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

【分析解答】

$2049 = 100000000001\mathrm{B} = +1.00000000001\mathrm{B}\times 2^{11}$,用 32 位补码整数表示为 000000000000000000010000000001,用十六进制形式表示为 00000801H;用 IEEE 754 单精度浮点数格式表示时,符号 $s = 0$,阶码 $e = 11 + 127 = 10001010\mathrm{B}$,尾数的小数部分 $f = 0.00000000001\mathrm{B}$,因此,2049 用 IEEE 754 单精度浮点数格式表示为 0 100 0101 0 000 0000 0001 0000 0000 0000,用十六进制形式表示为 4500 1000H。

在上述两种表示中,存在相同的二进制序列 000 0000 0001。因为 2049 被转换为规格化浮点数后,有效数值部分中最前面的 1 被隐藏,其余数值部分为 000 0000 0001,而 2049 的 32 位补码整数表示中保留了完整的有效数值部分,即最前面的 1 没有被隐藏,所以除了这个 1 之外后面的二进制序列 000 0000 0001 是相同的。

15. 设一个变量的值为 −2147483646,要求分别用 32 位补码整数和 IEEE 754 单精度浮点格式表示该变量(结果用十六进制表示),并说明哪种表示其值完全精确,哪种表示的是近似值。

【分析解答】

$-2147483646 = -111111111111111111111111110\mathrm{B} = -1.1111111111111111111111111111111111111111111111111111111111111111$

1111 1111 1111 1110 × 2³⁰,32 位补码形式为 1000 0000 0000 0000 0000 0000 0000 0010 (8000 0002H),IEEE 754 单精度格式为 1 100 1110 1 111 1111 1111 1111 1111 111 (CEFF FFFFH),因为 −2147483646 在 −2³¹ ∼ 2³¹−1 范围内,可用 32 位补码精确表示;对于 IEEE 754 单精度浮点数格式,最多只可表示 24 位有效二进位数字,而 −2147483646 的有效二进位有 30 位,后面的有效二进位必须截断,因而是近似表示。

16. 假定变量 $i, f$ 和 $d$ 的数据类型分别为 int, float 和 double, sizeof(int) = 4,已知 $i = 1234567890$,$f = 1.23456789 \times 10$,要求给出以下各关系表达式的结果,并说明原因。

(1) $i = = (\text{int})(\text{float})i$。
(2) $i = = (\text{int})(\text{double})i$。
(3) $f = = (\text{float})(\text{int})f$。
(4) $f = = (\text{float})(\text{double})f$。

【分析解答】

(1) 结果为“假”。因为 float 类型采用 IEEE 754 单精度浮点数格式,尾数的小数部分只有 23 个二进位和一位隐藏位,共有 24 位有效位数,相应地,十进制有效位数为 7 位,而 $i$ 中有 9 位有效位数,因而将 $i$ 转换为 float 类型时会发生有效数字的丢失,再转换为 int 类型


<!-- page: 47 -->

时,其值已经被改变了。

(2) 结果为“真”。因为 double 类型采用 IEEE 754 双精度浮点数格式,其有效位数为 $52 + 1 = 53$ 个二进位,而 int 类型的有效位数有 31 个二进位,因而,对于任何一个 int 类型的变量,转换为 double 后,精度不会有任何损失,再转换回 int 类型时,其值不变。

(3) 结果为“假”。因为变量 $f$ 的值超过了 int 类型可表示的最大值,因而将 $f$ 转换为 int 类型后再转换回 float 类型时,其值已经改变。

(4) 结果是“真”。因为 double 类型的精度比 float 类型高,任何 float 类型变量的值转换为 double 后再转换回 float 类型时,其值不变。

17. 假定一台 32 位字长的机器中带符号整数用补码表示,浮点数用 IEEE 754 标准表示,寄存器 R1 和 R2 的内容分别为 8020 0000H 和 0080 0000H。不同指令对寄存器进行不同的操作,因而,不同指令执行时寄存器内容对应的真值不同。假定执行下列运算指令时,操作数为寄存器 R1 和 R2 的内容,则 R1 和 R2 中操作数的真值分别为多少?

(1) 无符号数加法指令。

(2) 带符号整数乘法指令。

(3) 单精度浮点数减法指令。

## 【分析解答】

寄存器 R1 的内容为 1000 0000 0010 0000 0000 0000 0000 0000,寄存器 R2 的内容为 0000 0000 1000 0000 0000 0000 0000。

(1) 对于无符号数加法指令,R1 和 R2 的内容均被解释成无符号整数,即 R1 的真值为 8020 0000H,R2 的真值为 80 0000H,也即 R1 的真值为 $2^{31} + 2^{21}$,R2 的真值为 $2^{23}$。

(2) 对于带符号整数乘法指令,R1 和 R2 的内容均被解释为补码整数,由最高位可知,R1 为负数,R2 为正数。R1 的真值为 $-0111\ 1111\ 1110\ 0000\ 0000\ 0000\ 0000\ 0000\ \mathrm{B} = -7\mathrm{FE}0\ 0000\ \mathrm{H}$;R2 的真值为 $+80\ 0000\ \mathrm{H}$。也即 R1 的真值为 $-(2^{31} - 2^{21})$,R2 的真值为 $2^{23}$。

(3) 对于单精度浮点数减法指令,R1 和 R2 的内容均为 IEEE 754 单精度浮点数表示。由 R1 的内容可知,其符号位为 1,表示负数,阶码为 0000 0000,尾数部分为 010 0000 0000 0000 0000 0000,因为阶码为全 0 尾数为非 0 数,故 R1 是非规格化浮点数,其指数为 $-126$,尾数为 0.01B,故 R1 表示的真值为 $-0.01\mathrm{B} \times 2^{-126} = -2^{-128}$。由 R2 的内容可知,其符号位为 0,表示正数,阶码为 0000 0001,尾数部分为 000 0000 0000 0000 0000 0000,R1 为规格化浮点数,其指数为 $1 - 127 = -126$,尾数为 1.0B,故 R2 表示的真值为 $+1.0 \times 2^{-126} = 2^{-126}$。

18. IBM 370 的短浮点数格式中,总位数为 32 位,左边第一位 $(b_0)$ 为数符,随后 7 位 $(b_1 \sim b_7)$ 为阶码,用移码表示,偏置常数为 64,右边 24 位 $(b_8 \sim b_{31})$ 为 6 位十六进制原码小数表示的尾数,采用规格化形式,基为 16。若将十进制数 $-260.125$ 用该浮点数格式表示,则对应的机器数是什么?(要求用十六进制形式表示)

## 【分析解答】

IBM 370 的短浮点数格式的尾数采用十六进制原码表示,基数是 16。因此,在进行数据转换时,要先转化成十六进制形式,即 $-260.125 = -0001\ 0000\ 0100.0010\ \mathrm{B} = (-104.2)_{16} = (-0.1042)_{16} \times 16^3$。由此可知,浮点数符号位应为 1,指数为 3,用 7 位移码表示为 $64 + 3 = 100$


<!-- page: 48 -->

0011B,故前8位表示为1100 0011,对应的十六进制为C3H,尾数部分的6位十六进制数为10 4200H,因此,对应的机器数为C310 4200H。

19. 导弹系统中有一个内置时钟,用计数器实现,每隔 0.1s 计数一次。程序用 0.1 乘以计数器的值得到以秒为单位的时间。0.1 的二进制表示是一个无限循环序列;0.00011 [0011]…(方括弧中的序列是重复的)。

(1)假定用一个类型为 float 的变量 $x$ 来表示 0.1,则变量 $x$ 在机器中的机器数是什么(要求写成十六进制形式)?绝对值 $|x - 0.1|$ 的值是什么(要求用十进制表示)?

(2)该导弹系统启动时计数器的初始值为 0,并开始持续计数。假定当时系统运行了 200h,则程序计算的时间和实际时间的偏差为多少?如果该导弹根据目标物体的速度乘以它被侦测到的时间来预测位置,若目标物体的速度为 $2000\mathrm{m / s}$,则预测偏差的距离为多少?

【分析解答】

(1)$0.1 = 0.00011[0011]\mathrm{B} = +1.1001100110011001100110011\cdots \mathrm{B}\times 2^{-4}$,float 类型采用 IEEE 754 单精度浮点数格式。符号位 $s$ 为 0,阶码 $e = 127 - 4 = 123 = 01111011\mathrm{B}$,尾数的小数部分为 0.100 1100 1100 1100 1100 1101,因此,在机器中 float 型变量 $x$ 表示为 0 011 1101 1 100 1100 1100 1100 1101,用十六进制形式表示为 3DCC CCCDH。由于 float 类型的精度有限,只有 24 位有效位数,尾数从最前面的 1 开始一共只能表示 24 位,后面的有效数字需考虑舍入,故 $x$ 与 0.1 之间的误差为 $|x - 0.1| = 0.00000000000000000000000000001100[1100]\mathrm{B}$。这个值等于 $0.1\times 2^{-26}$,大约为 $1.49\times 10^{-9}$。

(2)该导弹系统运行 200h 后,共计数 $200 \times 60 \times 60 \times 10 = 72 \times 10^{5}$ 次。因此,程序计算的时间和实际时间的偏差约为 $1.49 \times 10^{-9} \times 72 \times 10^{5} = 0.0107\mathrm{s}$。预测偏差距离约为 2000 m/s × 0.0107s = 21.4m。

20. 假定浮点数的阶码用 $m$ 位移码表示,偏置常数为 $2^{m-1} - 1$,规格化尾数的整数部分为 1,是隐藏位,小数部分有 $n$ 位,用原码表示,基为 2,请回答下列问题:

(1)能用这种浮点数格式精确表示的最小正整数是多少?

(2)不能用这种浮点数格式精确表示的最小正整数是多少?

【分析解答】

(1)能用这种浮点数格式表示的最小正整数为 1。

(2)这种浮点数格式的有效位数为 $n + 1$ 位,因此,当某个正整数的有效位数大于 $n + 1$ 位时,则 $n + 1$ 位后的有效数字被截断,即不能用这种浮点数格式精确表示。因此,不能用这种浮点数格式表示的最小正整数为 $+10\cdots 01\mathrm{B}$(中间有 $n$ 位 0),其值为 $2^{n + 1} + 1$。

21. 假定在一个程序中定义了变量 $x, y$ 和 $i$,其中,$x$ 和 $y$ 是 float 型变量(用 IEEE 754 单精度浮点数表示),$i$ 是 16 位 short 型变量(用补码表示)。程序执行到某一时刻,$x = -130, y = 7.25, i = 130$,它们都被写到了主存(按字节编址),其地址分别是 $\&amp;, x, \&amp;, y$ 和 $\&amp;, i$。请分别给出在大端机器和小端机器上变量 $x, y$ 和 $i$ 在内存的存放位置。

【分析解答】

$x = -130 = -10000010\mathrm{B} = -1.000001\mathrm{B}\times 2^{7}$,阶码 $e = 127 + 7 = 128 + 6 = 10000110$,所以,用 IEEE 754 单精度浮点数表示为 1 100 0011 0 000 0010 0000 0000 0000 0000 =


<!-- page: 49 -->

C302 0000H。

$y = 7.25 = 111.01\mathrm{B} = +1.1101\mathrm{B}\times 2^{2}$ ,阶码 $e = 127 + 2 = 128 + 1 = 10000001$ ,所以,用IEEE754单精度浮点数表示为01000000111010000000000000000000000000000000000000000000000000000000000000000000000000

上述三个数据在大端机器和小端机器上的存放位置如表2.5所示。

表 2.5 数据在大端和小端机器中的存放位置

[tbl-12.md](tbl-12.md)

22. 假定某计算机存储器按字节编址,CPU从存储器中读出一个4字节信息D=32343538H,该信息的内存地址为0000F00CH,按小端方式存放,请回答下列问题:

(1)该信息D占用了几个内存单元?这几个内存单元的地址及其内容各是什么?
(2)若D是一个32位无符号数,则其值是多少?
(3)若D是一个32位补码表示的带符号整数,则其值是多少?
(4)若D是一个IEEE754单精度浮点数,则其值是多少?
(5)若D是一个用8421码表示的无符号整数,则其值是多少?
(6)若D是一个字符串,每个字节的低7位表示对应字符的ASCII码,则对应字符串是什么?
(7)若D是两个汉字的国标码,则这两个汉字在GB2312字符集码表中分别位于哪一行和哪一列?
(8)若D中前三个字节分别是一个像素的R、G、B分量的颜色值,则其值各是多少?

【分析解答】

将32343538H展开为二进制表示为00110010001101000011010100111000B。

(1)因为存储器按字节编址,所以4字节占用4个内存单元,其地址分别是0000F00CH、0000F00DH、0000F00EH、0000F00FH。由于采用小端方式存放,所以,最低有效字节38H存放在0000F00CH中,35H存放在0000F00DH中,34H存放在0000F00EH中,32H存放在0000F00FH。
(2)无符号数。值为 $2^{29} + 2^{28} + 2^{25} + 2^{23} + 2^{20} + 2^{18} + 2^{15} + 2^{12} + 2^{10} + 2^{8} + 2^{5} + 2^{4} + 2^{3}$ 。
(3)补码整数。符号为0,表示其为正数,其值与无符号数的值一样。
(4)IEEE 754 单精度浮点数。根据 IEEE 754 单精度浮点数格式可知,符号位 $s = 0$ ,为正数;阶码 $e = 01100100\mathrm{B} = 100$ ,故阶为 $100 - 127 = -27$ ;尾数小数部分 $f = 0.01101000011010100111000$ ,所以,其值为 $1.0110100001101010011\mathrm{B}\times 2^{-27}$ 。
(5)8421码整数。32343538H各位表示对应十进制数32343538,所以,其值


<!-- page: 50 -->

为 32343538。

(6) ASCII 码字符串。各字节的低 7 位分别为 011 0010、011 0100、011 0101、011 1000,所以,对应的字符串为“2458”。

(7) 汉字。对国标码每个字节各自减 20H,得到两个汉字的区位码,分别为 1214H 和 1518H,第一个汉字在 GB 2312 字符集码表中位于第 18(12H) 行、第 20(14H) 列,第二个汉字位于第 21(15H) 行、第 24(18H) 列。

(8) 颜色值。该像素的 R、G、B 分量的颜色值分别为 0011 0010B = 50,0011 0100B = 52,0011 0101B = 53。


<!-- page: 51 -->