408 真题做题本·计算机组成原理部分
第 2 章 数据的表示和运算
2.1 数制与编码
- 【2013】用海明码对长度为 8 位的数据进行检错和纠错时,若能纠正一位错误,则校验位数至少为( )。
A. 2
B. 3
C. 4
D. 5
答案: C
解析: 设数据位数为 ,校验位数为 。若海明码能够纠正一位错误,需要满足
当 时,,不满足;当 时,,满足。因此校验位至少为 4 位,选 C。
- 【2018】冯·诺依曼结构计算机中数据采用二进制编码表示,其主要原因是( )。
I. 二进制的运算规则简单
II. 制造两个稳态的物理器件较容易
III. 便于用逻辑门电路实现算术运算
A. 仅 I、II
B. 仅 I、III
C. 仅 II、III
D. I、II 和 III
答案: D
解析:
二进制适合计算机使用,主要有以下三点原因:
- 二进制只有 和 两种状态,算术运算和逻辑运算规则都比较简单;
- 现实中的电子器件较容易形成高电平、低电平或导通、截止等两个稳定状态,抗干扰能力也较强;
- 二进制运算可直接由与门、或门、非门、异或门等逻辑门电路实现。
因此 I、II、III 均正确,选择 D。
2.2 整数表示和运算
- 【2010】假定有 4 个整数用 8 位补码分别表示 ,,,。若将运算结果存放在一个 8 位寄存器中,则下列运算中会发生溢出的是( )。
A.
B.
C.
D.
答案: B
解析:
8 位补码的表示范围为
各机器数对应的真值为
分别计算:
- A:,未溢出;
- B:,发生溢出;
- C:,未溢出;
- D:,未溢出。
故选择 B。
- 【2013】某字长为 8 位的计算机中,已知整型变量 和 的机器数分别为 、。若整型变量 ,则 的机器数为( )。
A. 1100 0000
B. 0010 0100
C. 1010 1010
D. 溢出
答案: A
解析:
由补码求真值:
乘以 相当于左移一位,除以 对带符号补码整数通常采用算术右移一位,因此
于是
的 8 位补码为
因此选择 A。
- 【2014】若 ,,则下列表达式采用 8 位定点补码运算实现时,会发生溢出的是( )。
A.
B.
C.
D.
答案: C
解析:
8 位补码可表示的范围为
逐项计算:
其中只有 超过最大可表示正数 ,因此 会发生溢出,选择 C。
- 【2015】由 3 个“1”和 5 个“0”组成的 8 位二进制补码,能表示的最小整数是( )。
A.
B.
C.
D.
答案: B
解析:
要表示尽可能小的负数,最高位必须为 。8 位补码的权值为
总共只能有 3 个“1”,除符号位外还剩两个“1”。为了使真值最小,应让这两个“1”放在权值最小的位置,即最低两位:
故选择 B。
- 【2018】假定带符号整数采用补码表示,若 int 型变量 和 的机器数分别是 FFFF FFDFH 和 0000 0041H,则 、 的值及 的机器数分别是( )。
A. ,, 的机器数溢出
B. ,, 的机器数为 FFFF FF9DH
C. ,, 的机器数为 FFFF FF9EH
D. ,, 的机器数为 FFFF FF96H
答案: C
解析:
为负数补码。其绝对值可通过按位取反再加 得到:
因此
而
所以
,取补码得
故选择 C。
- 【2018】整数 的机器数为 11011000,分别对 进行逻辑右移 1 位和算术右移 1 位操作,得到的机器数分别是( )。
A. 1110 1100,1110 1100
B. 0110 1100,1110 1100
C. 1110 1100,0110 1100
D. 0110 1100,0110 1100
答案: B
解析:
逻辑右移时,最高位一律补 :
算术右移用于带符号数,为保持符号不变,最高位补原符号位。由于原最高位为 ,故补 :
因此选择 B。
注:原题机器数漏写了一位,结合选项应为 8 位机器数 11011000。
- 【2021】已知带符号整数用补码表示,变量 、、 的机器数分别为 FFFDH、FFDFH、7FFCH,下列结论正确的是( )。
A. 若 、 和 为无符号整数,则
B. 若 、 和 为无符号整数,则
C. 若 、 和 为带符号整数,则
D. 若 、 和 为带符号整数,则
答案: D
解析:
若按无符号整数解释:
故应有
A、B 均错误。
若按 16 位补码解释:
因此
选择 D。
- 【2022】32 位补码所能表示的整数范围是( )。
A.
B.
C.
D.
答案: B
解析:
位补码的表示范围为
当 时,范围为
故选择 B。
2.3 浮点数的表示和运算
- 【2009】浮点数加、减运算过程一般包括对阶、尾数运算、规格化、舍入和判溢出等步骤。设浮点数的阶码和尾数均采用补码表示,且位数分别为 5 位和 7 位(均含 2 位符号位)。若有两个数 ,,则用浮点加法计算 的最终结果是( )。
A. 00111 1100010
B. 00111 0100010
C. 01000 0010001
D. 发生溢出
答案: C
解析:
先将两个数写成二进制规格化形式:
对阶时应使阶码相同。将 的阶码由 调整为 ,尾数右移两位:
尾数相加:
结果出现尾数溢出,需要右规一位并将阶码加 :
阶码 的 5 位双符号位补码为 01000,尾数 的 7 位双符号位补码为 0010001,因此最终机器数为
故选择 C。
- 【2011】float 型数据通常用 IEEE 754 单精度浮点数格式表示。若编译器将 float 型变量 分配到一个 32 位浮点寄存器 FR1 中,且 ,则 FR1 的内容是( )。
A. C104 0000H
B. C242 0000H
C. C184 0000H
D. C1C2 0000H
答案: A
解析:
先将 化为二进制:
因此:
- 符号位 ;
- 实际指数为 ,移码阶码为
- 尾数字段为小数点后的部分
故 IEEE 754 单精度机器数为
写成十六进制为
故选择 A。
- 【2012】float 类型(即 IEEE 754 单精度浮点数格式)能表示的最大正整数是( )。
A.
B.
C.
D.
答案: D
解析:
IEEE 754 单精度浮点数中:
- 阶码字段为 8 位;
- 阶码全为 时用于表示无穷大和 NaN;
- 最大有限数的阶码字段为 254,对应实际指数
- 尾数字段全为 ,有效数为
因此最大正有限数为
故选择 D。
- 【2013】若某数采用 IEEE 754 单精度浮点数格式表示为 C640 0000H,则该数的值是( )。
A.
B.
C.
D.
答案: A
解析:
将 C640 0000H 写成二进制:
按 IEEE 754 单精度格式划分为
因此:
- 符号位为 ,表示负数;
- 阶码字段 ,实际指数为
- 有效数为
所以该数为
故选择 A。
- 【2014】float 型数据常用 IEEE 754 单精度浮点格式表示。假设两个 float 型变量 和 分别存放在 32 位寄存器 和 中,若 、,则 和 之间的关系为( )。
A. 且符号相同
B. 且符号不同
C. 且符号相同
D. 且符号不同
答案: A
解析:
两个机器数的最高位都为 ,因此 和 均为负数,符号相同。
对于同为负数的规格化浮点数,绝对值越大,真值反而越小。比较阶码即可看出:
- 的阶码明显大于 的阶码,因此 ;
- 又因为二者均为负数,所以
故选择 A。
- 【2015】下列有关浮点数加减运算的叙述中,正确的是( )。
I. 对阶操作不会引起阶码上溢或下溢
II. 右规和尾数舍入都可能引起阶码上溢
III. 左规时可能引起阶码下溢
IV. 尾数溢出时,结果不一定溢出
A. 仅 II、III
B. 仅 I、II、IV
C. 仅 I、III、IV
D. I、II、III、IV
答案: D
解析:
逐项判断:
- I 正确。对阶时通常把小阶数的尾数右移,使其阶码增大到较大阶数;最终阶码直接取原来较大的阶码,不会因为对阶本身产生新的阶码越界。
- II 正确。右规需要使阶码加 ;舍入也可能使尾数产生进位,进而再次右规并使阶码加 ,两者都可能造成阶码上溢。
- III 正确。左规需要使阶码减 ,连续左规可能导致阶码下溢。
- IV 正确。尾数运算发生溢出时,通常可通过右规处理;只有右规后阶码超出可表示范围,整个浮点结果才真正溢出。
因此四项均正确,选择 D。
- 【2018】IEEE 754 单精度浮点格式表示的数中,最小的规格化正数是( )。
A.
B.
C.
D.
答案: A
解析:
IEEE 754 单精度规格化数的最小非零阶码字段为
其实际指数为
取最小规格化尾数 ,得到最小规格化正数
是最小非规格化正数,不是规格化数。故选择 A。
- 【2020】已知带符号整数用补码表示,float 型数据用 IEEE 754 标准表示,假定变量 的类型只能是 int 或 float,当 的机器数为 C800 0000H 时, 的值可能是( )。
A.
B.
C.
D.
答案: A
解析:
若把 C800 0000H 解释为 32 位 int 补码,则其真值为
若把它解释为 IEEE 754 单精度浮点数,则位模式为
实际指数为
故浮点值为
选项中只有 A 可能成立,故选择 A。
注:原文件中 B 项写成了 ,这会导致 A、B 同时成立。依据原真题,B 项应为 。
- 【2021】下列数值中,不能用 IEEE 754 浮点格式精确表示的是( )。
A. 1.2
B. 1.25
C. 2.0
D. 2.5
答案: A
解析:
二进制浮点数能够精确表示的有限小数,其既约分数的分母必须是 的整数次幂。
这些数的分母均为 的幂,因此可以精确表示。
而
分母含因子 ,其二进制小数是无限循环的,不能用有限位 IEEE 754 浮点数精确表示。
故选择 A。
- 【2022】 的 IEEE 754 单精度浮点数表示为( )。
A. BEE0 0000H
B. BF60 0000H
C. BF70 0000H
D. C0E0 0000H
答案: A
解析:
先将绝对值化为二进制:
因此:
- 符号位为 ;
- 阶码字段为
- 尾数字段为
于是机器数为
写成十六进制为
故选择 A。
- 【2023】已知 float 型变量用 IEEE 754 单精度浮点数格式表示。若 float 型变量 的机器数为 8020 0000H,则 的值是( )。
A.
B.
C.
D. 非数(NaN)
答案: A
解析:
将 8020 0000H 按 IEEE 754 单精度格式划分:
符号位为 ,阶码字段全为 ,尾数字段不全为 ,因此这是一个负的非规格化数,而不是 NaN。
非规格化数的数值为
本题尾数字段为 ,故
故选择 A。
- 【2024】某科学实验中,需要使用大量的整型参数。为了在保证表数精度的基础上提高运算速度,需要选择合理的数据表示方法。若整型参数 、 的取值范围分别为 、,则下列选项中,、 最适宜采用的数据表示方法分别是( )。
A. 32 位整数、32 位整数
B. 单精度浮点数、单精度浮点数
C. 32 位整数、双精度浮点数
D. 单精度浮点数、双精度浮点数
答案: C
解析:
对于 :
显然落在 32 位有符号整数范围
之内,而且使用整数表示可以保证所有整数均精确,因此 适合采用 32 位整数。
对于 ,其范围达到 ,超出 32 位整数范围。IEEE 754 单精度浮点数只有 24 位有效二进制位,不能保证该范围内所有整数都精确表示;双精度浮点数具有 53 位有效二进制位,可以精确表示绝对值不超过 的整数,因此能够保证 的精度。
故选择 C。
2.4 C 语言中的类型转换
- 【2009】一个 C 语言程序在一台 32 位机器上运行。程序中定义了三个变量 、、,其中 和 为 int 型, 为 short 型。当 、 时,执行赋值语句 后,、、 的机器数分别是( )。
A. ,,
B. ,,
C. ,,
D. ,,
答案: D
解析:
,其 32 位补码为
,先写出 的 16 位二进制形式并取补码:
计算 时,short 型的 先进行整型提升,符号扩展为 32 位:
于是
故选择 D。
- 【2010】假定变量 、 和 的数据类型分别为 int、float 和 double(int 用补码表示,float 和 double 分别用 IEEE 754 单精度和双精度浮点数格式表示),已知 、、。若在 32 位机器中执行下列关系表达式,则结果为“真”的是( )。
I. i == (int)(float)i
II. f == (float)(int)f
III. f == (float)(double)f
IV. d + f - d == f
A. 仅 I、II
B. 仅 I、III
C. 仅 II、III
D. 仅 III、IV
答案: B
解析:
逐项判断:
- I: 的二进制有效位数远小于 24 位,能够被 float 精确表示,转成 float 后再转回 int 仍为 ,故为真。
- II: 约为 ,强制转换为 int 时小数部分被截去,得到 ;再转回 float 后为 ,与原来的 不相等,故为假。
- III:float 转换为 double 时数值可被精确扩展,再转换回 float 能恢复原来的 float 位模式,故为真。
- IV: 的数量级约为 ,远大于 。计算 时, 因有效位不足被舍去,故 ,随后
故为假。
因此只有 I、III 为真,选择 B。
- 【2012】假定编译器规定 int 和 short 类型长度分别为 32 位和 16 位,执行下列 C 语言语句:
unsigned short x = 65530;
unsigned int y = x;
得到 的机器数为( )。
A. 0000 7FFAH
B. 0000 FFFAH
C. FFFF 7FFAH
D. FFFF FFFAH
答案: B
解析:
是 unsigned short,转换为 32 位 unsigned int 时进行零扩展,而不是符号扩展:
故选择 B。
- 【2016】有如下 C 语言程序段:
short si = -32767;
unsigned short usi = si;
执行上述两条语句后,usi 的值为( )。
A.
B.
C.
D.
答案: D
解析:
的 16 位补码为
赋值给 unsigned short 后,位模式保持为 8001H,只是改用无符号方式解释:
也可利用有符号数转换为同宽无符号数的模运算规则:
故选择 D。
- 【2019】考虑以下 C 语言代码,执行程序段后,
si的值是( )。
unsigned short usi = 65535;
short si = usi;
A.
B.
C.
D.
答案: A
解析:
unsigned short 的 对应 16 位机器数
将其赋给同为 16 位的 short 后,通常保持低 16 位不变,再按补码解释。FFFFH 作为 16 位补码表示
故选择 A。
- 【2023】若 short 型变量 ,则 的机器数是( )。
A. E002H
B. E001H
C. 9FFFH
D. 9FFEH
答案: A
解析:
先将 写成十六进制:
求 16 位补码:
因此 的机器数为 E002H,选择 A。
- 【2024】C 语言代码如下。执行下列代码段后, 的值是( )。
int i = 32777;
short si = i;
int j = si;
A.
B.
C.
D.
答案: B
解析:
将 32 位 int 转换为 16 位 short 时保留低 16 位,得到
8009H 的最高位为 ,按 16 位补码解释:
再将 short 型的 si 转换为 int 时进行符号扩展,数值仍为 ,故选择 B。
- 【2011】假定在一个 8 位字长的计算机中运行如下类 C 程序段:
unsigned int x = 134;
unsigned int y = 246;
int m = x;
int n = y;
unsigned int z1 = x - y;
unsigned int z2 = x + y;
int k1 = m - n;
int k2 = m + n;
若编译器将 8 个 8 位寄存器 R1~R8 分别分配给变量 、、、、、、 和 。请回答下列问题(带符号整数用补码表示):
(1)执行上述程序段后,寄存器 R1、R5 和 R6 的内容分别是什么?用十六进制表示。
(2)执行上述程序段后,变量 和 的值分别是多少?用十进制表示。
(3)上述程序段涉及带符号整数加/减、无符号整数加/减运算,这四种运算能否利用同一个加法器及辅助电路实现?简述理由。
(4)计算机内部如何判断带符号整数加/减运算的结果是否发生溢出?上述程序段中,哪些带符号整数运算语句的执行结果会发生溢出?
答案:
(1)R1、R5、R6 的内容依次为 86H、90H、7CH。
(2),。
(3)可以使用同一个加法器及辅助电路实现。
(4)k2 = m + n 发生溢出,k1 = m - n 不发生溢出。
解析:
(1)求 R1、R5 和 R6 的内容
8 位无符号整数按模 运算。
变量 ,故
因此
对于 :
无符号运算结果按模 截断:
因此
对于 :
按模 截断:
因此
(2)求 和
在本题所采用的机器级解释中,将 8 位无符号数赋给 8 位带符号数时,寄存器中的位模式保持不变。
的位模式为
将其按 8 位补码解释:
同理, 的位模式为
按补码解释为
所以
在 8 位补码范围 内,机器数为 90H。
(3)能否共用一个加法器
可以。
无论操作数按有符号数还是无符号数解释,加法器对两个 位二进制位串执行的低 位加法完全相同。减法也可以化为补码加法:
因此带符号加法、带符号减法、无符号加法和无符号减法均可复用同一个 位加法器。它们的差别主要在于:
- 无符号运算根据进位或借位标志 CF 判断越界;
- 带符号运算根据溢出标志 OF 判断结果是否超出补码范围;
- 减法时还需要对第二个操作数取反并设置最低位进位输入为 。
(4)溢出判断及本题结果
带符号加法 的溢出条件是:两个操作数符号相同,而结果符号与操作数符号不同。设符号位分别为 、、,则
带符号减法 的溢出条件是:、 符号不同,且结果符号与 不同,即
也可以利用符号位的进位判断:符号位的进位输入与进位输出不同时,。
本题中:
结果可表示,不溢出。
而
超出 8 位补码的最小值。机器只保留低 8 位,得到 7CH,即按补码解释为 ,两个负数相加却得到正数,因此发生溢出。
故只有语句
int k2 = m + n;
发生带符号溢出。
- 【2017】已知
计算 的 C 语言函数 如下:
int f1(unsigned n) {
int sum = 1, power = 1;
for (unsigned i = 0; i <= n - 1; i++) {
power *= 2;
sum += power;
}
return sum;
}
将 中的 int 都改为 float,可得到计算 的另一个函数 。假设 unsigned 和 int 型数据都占 32 位,float 采用 IEEE 754 单精度标准。请回答下列问题:
(1)当 时, 会出现死循环,为什么?若将 中的变量 和 都定义为 int 型,则 是否还会出现死循环?为什么?
(2) 和 的返回值是否相等?机器数各是什么?用十六进制表示。
(3) 和 的返回值分别为 33554431 和 33554432.0,为什么不相等?
(4),而 的返回值却为 ,为什么?若使 的返回值与 相等,则最大的 是多少?
(5) 的机器数为 7F80 0000H,对应的值是什么?若使 的结果不溢出,则最大的 是多少?若使 的结果精确(无舍入),则最大的 是多少?
答案:
(1)unsigned 的 在 时回绕为 ,循环变量 也会回绕,因此循环条件始终成立;若 、 均改为 int,则不会死循环。
(2)数值相等,均为 16777215; 的机器数为 00FF FFFFH, 的机器数为 4B7F FFFFH。
(3)单精度浮点数有效位有限,33554431 需要 25 位有效二进制位,按“舍入到最近、偶数优先”得到 33554432.0。
(4) 的低 32 位全为 ,按 int 补码解释为 ;最大 。
(5)7F80 0000H 表示正无穷大;不溢出的最大 ;结果精确的最大 。
解析:
(1) 时的死循环
是 unsigned 类型。当 时,表达式 不是 ,而是发生模 回绕:
循环条件变成
i <= 0xFFFFFFFFU
也是 unsigned,取值范围为 。当 增加到最大值后再加 ,又回绕为 ,所以条件始终为真,程序出现死循环。
若将 、 都改为 int,则 时
初始 ,判断 为假,循环一次也不执行,不会出现死循环。
(2) 与
该数的二进制表示恰好是 24 个连续的 。IEEE 754 单精度浮点数具有 24 位有效二进制精度,包括隐藏的最高位,因此可以精确表示该数。
所以两函数返回值在数值上相等。
是 int,机器数为
的规格化形式为
其中尾数字段为 23 个 ,阶码为
因此机器数为
(3)为什么 被舍入
其二进制表示包含 25 个有效位,而单精度 float 只能保留 24 个有效位。在 附近,相邻可表示浮点数的间隔为
所以相邻的可表示数是
恰好位于二者中间。IEEE 754 默认采用“舍入到最近,距离相同时取尾数最低位为偶数者”的规则,因此舍入为
(4) 及其精确范围
该结果超出 32 位 int 的最大值 。机器保留低 32 位后位模式为 FFFF FFFFH,按 32 位补码解释即为
若要求 的返回值与数学上的 相等,需要
因此
即
最大 为 。
(5) 的溢出范围和精确范围
IEEE 754 单精度机器数 7F80 0000H 的阶码全为 、尾数全为 、符号位为 ,表示
从 开始,舍入使得求和结果逐步成为 。当 时,结果为
仍是有限单精度数;当 时,需要得到约 的结果,超过最大有限单精度数,舍入为正无穷大。因此不发生溢出的最大值为
要保证结果无舍入,需要 的有效二进制位数不超过 24,即
所以结果精确的最大值为
2.5 运算方法和运算电路
- 【2011】某机器有一个标志寄存器,其中有进位/借位标志 CF、零标志 ZF、符号标志 SF 和溢出标志 OF。条件转移指令
bgt(无符号整数比较大于时转移)的转移条件是( )。
A.
B.
C.
D.
答案: C
解析:
比较两个无符号整数 、 时,处理器通常执行
若 ,应同时满足:
- 结果不为 ,即 ;
- 减法没有产生借位,即 。
因此转移条件为
等价于
故选择 C。
注:原文件中的选项上划线缺失。若没有上划线,四个选项均不能正确表达“CF 与 ZF 均为 0”。
- 【2018】减法指令
sub R1, R2, R3的功能为“”,该指令执行后将生成进位/借位标志 CF 和溢出标志 OF。若 ,,则该减法指令执行后,CF 与 OF 分别为( )。
A.
B.
C.
D.
答案: A
解析:
按无符号数解释:
因此执行减法时不需要借位,故
按 32 位补码解释:
所以
结果在 32 位有符号整数范围内,没有溢出,故
因此选择 A。
- 【2023】已知 、 为 int 类型,当 、 时,执行 指令得到的溢出标志 OF 和借位标志 CF 分别为 、。那么当 、 时,执行该指令得到的 OF 和 CF 分别是( )。
A.
B.
C.
D.
答案: B
解析:
按带符号整数计算:
在 int 的表示范围内,因此不发生有符号溢出:
判断 CF 时按无符号数解释操作数。 的 32 位补码对应一个很大的无符号数:
由于
执行无符号减法时需要借位,因此
故选择 B。
- 【2024】下列关于整数乘法运算的叙述中,错误的是( )。
A. 用阵列乘法器实现的乘运算可以在一个时钟周期内完成
B. 用 ALU 和移位器实现的乘运算无法在一个时钟周期内完成
C. 变量与常数的乘运算可编译优化为若干条移位及加/减运算指令
D. 两个变量的乘运算无法编译转换为移位及加法等指令的循环实现
答案: D
解析:
- A 正确。阵列乘法器通过组合逻辑并行产生和累加部分积,在电路延迟允许的情况下可在一个时钟周期内完成乘法。
- B 正确。若复用 ALU 和移位器,通常需要逐位判断乘数并反复执行“加法—移位”,需要多个时钟周期。
- C 正确。例如
编译器可将常数乘法优化为移位和加减指令。
- D 错误。两个变量的乘法同样可以通过循环检查乘数各位,并用移位与加法累加部分积来实现,只是执行速度通常较慢。
故选择 D。
- 【2020】有实现 的两个 C 语言函数如下:
unsigned umul(unsigned x, unsigned y) { return x * y; }
int imul(int x, int y) { return x * y; }
假定某计算机 M 中 ALU 只能进行加减运算和逻辑运算。请回答下列问题:
(1)若 M 的指令系统中没有乘法指令,但有加法、减法和位移等指令,则在 M 上也能实现上述两个函数中的乘法运算,为什么?
(2)若 M 的指令系统中有乘法指令,则基于 ALU、位移器、寄存器以及相应控制逻辑实现乘法指令时,控制逻辑的作用是什么?
(3)针对以下三种情况:①没有乘法指令;②有使用 ALU 和位移器实现的乘法指令;③有使用阵列乘法器实现的乘法指令。函数 umul( ) 在哪种情况下执行时间最长?哪种情况下执行时间最短?说明理由。
(4) 位整数乘法指令可保存 位乘积,当仅取低 位作为乘积时,其结果可能会发生溢出。当 ,, 时,带符号整数乘法指令和无符号整数乘法指令得到的 的 位乘积分别是什么?用十六进制表示。此时函数 umul( ) 和 imul( ) 的返回结果是否溢出?对于无符号整数乘法运算,当仅取乘积的低 位作为乘法结果时,如何用 位乘积进行溢出判断?
答案:
(1)整数乘法可以分解为对部分积的移位和加法,带符号乘法还可通过符号处理或补码乘法算法实现。
(2)控制逻辑负责发出时序控制信号,判断乘数位,控制寄存器装入、移位、ALU 加减以及循环计数,并在运算完成后结束指令。
(3)没有乘法指令时执行时间最长;采用阵列乘法器时执行时间最短。
(4)带符号和无符号乘法得到的 64 位乘积均为 0000 0000 FFFF FFFEH。umul() 不溢出,imul() 溢出。无符号乘法仅取低 32 位时,若高 32 位不全为 ,则发生溢出。
解析:
(1)没有乘法指令仍能实现乘法的原因
二进制乘法可以写成若干个移位后的被乘数之和。若
其中 ,则
程序可以逐位检查乘数 :当最低位为 时,将当前被乘数加入部分积;随后被乘数左移、乘数右移,循环直到所有乘数位处理完毕。因此即使没有硬件乘法指令,也可以用加法、位移和逻辑指令通过软件实现乘法。
对于带符号整数,可先记录结果符号,对绝对值做无符号乘法后再求补;也可直接采用补码乘法算法。
(2)控制逻辑的作用
使用 ALU、移位器和寄存器实现乘法时,数据通路本身只负责执行具体的加减、移位和保存操作。控制逻辑负责协调这些部件,主要包括:
- 将被乘数、乘数和初始部分积装入相应寄存器;
- 检查乘数当前位,并决定本轮是否执行加法或减法;
- 控制 ALU 的运算类型;
- 控制被乘数、乘数或部分积寄存器的移位;
- 维护循环计数器,判断是否已经处理完全部 位;
- 在运算完成后把结果写回目标寄存器并结束乘法指令。
因此控制逻辑本质上负责产生乘法算法各步骤所需的时序控制信号。
(3)三种实现方式的速度比较
① 没有乘法指令时,编译器或运行库需要生成多条移位、条件判断、加法和循环控制指令。除了算术操作外,还要反复进行取指、译码和分支,因此执行时间通常最长。
② 使用 ALU 和移位器实现乘法指令时,乘法仍需经过多轮“判断—加法—移位”,但这些步骤在处理器内部由控制逻辑完成,减少了软件指令开销,速度通常快于情况①。
③ 阵列乘法器利用大量组合逻辑并行产生和压缩部分积,可在一个时钟周期或很少的流水级中完成乘法,执行时间通常最短。
因此:
- 最长:没有乘法指令;
- 最短:使用阵列乘法器实现乘法指令。
(4)乘积、返回结果与溢出判断
给定
数学乘积为
其 64 位二进制乘积为
因为两个操作数均为正数,无论使用带符号乘法指令还是无符号乘法指令,得到的完整 64 位位串都相同:
函数 umul() 将低 32 位 FFFF FFFEH 按 unsigned 解释:
该值在 32 位无符号整数范围 内,因此 umul() 的返回结果不溢出。
函数 imul() 也只返回低 32 位 FFFF FFFEH,但按 32 位补码解释为
而真实的带符号数学乘积为 ,超出 int 的范围 ,因此 imul() 发生溢出。
对于无符号 位乘法,若保留了完整的 位乘积,则只取低 位作为结果时:
- 高 位全为 ,说明完整乘积小于 ,不溢出;
- 高 位不全为 ,说明完整乘积不小于 ,舍弃高位会改变数值,发生溢出。
本题完整乘积的高 32 位为 0000 0000H,所以无符号乘法不溢出。