跳到主要内容

408 真题做题本·计算机组成原理部分

第 2 章 数据的表示和运算

2.1 数制与编码

  1. 【2013】用海明码对长度为 8 位的数据进行检错和纠错时,若能纠正一位错误,则校验位数至少为( )。

A. 2
B. 3
C. 4
D. 5

答案: C

解析: 设数据位数为 ,校验位数为 。若海明码能够纠正一位错误,需要满足

时,,不满足;当 时,,满足。因此校验位至少为 4 位,选 C。

  1. 【2018】冯·诺依曼结构计算机中数据采用二进制编码表示,其主要原因是( )。

I. 二进制的运算规则简单
II. 制造两个稳态的物理器件较容易
III. 便于用逻辑门电路实现算术运算

A. 仅 I、II
B. 仅 I、III
C. 仅 II、III
D. I、II 和 III

答案: D

解析:

二进制适合计算机使用,主要有以下三点原因:

  1. 二进制只有 两种状态,算术运算和逻辑运算规则都比较简单;
  2. 现实中的电子器件较容易形成高电平、低电平或导通、截止等两个稳定状态,抗干扰能力也较强;
  3. 二进制运算可直接由与门、或门、非门、异或门等逻辑门电路实现。

因此 I、II、III 均正确,选择 D。

2.2 整数表示和运算

  1. 【2010】假定有 4 个整数用 8 位补码分别表示 。若将运算结果存放在一个 8 位寄存器中,则下列运算中会发生溢出的是( )。

A.
B.
C.
D.

答案: B

解析:

8 位补码的表示范围为

各机器数对应的真值为

分别计算:

  • A:,未溢出;
  • B:,发生溢出;
  • C:,未溢出;
  • D:,未溢出。

故选择 B。

  1. 【2013】某字长为 8 位的计算机中,已知整型变量 的机器数分别为 。若整型变量 ,则 的机器数为( )。

A. 1100 0000
B. 0010 0100
C. 1010 1010
D. 溢出

答案: A

解析:

由补码求真值:

乘以 相当于左移一位,除以 对带符号补码整数通常采用算术右移一位,因此

于是

的 8 位补码为

因此选择 A。

  1. 【2014】若 ,则下列表达式采用 8 位定点补码运算实现时,会发生溢出的是( )。

A.
B.
C.
D.

答案: C

解析:

8 位补码可表示的范围为

逐项计算:

其中只有 超过最大可表示正数 ,因此 会发生溢出,选择 C。

  1. 【2015】由 3 个“1”和 5 个“0”组成的 8 位二进制补码,能表示的最小整数是( )。

A.
B.
C.
D.

答案: B

解析:

要表示尽可能小的负数,最高位必须为 。8 位补码的权值为

总共只能有 3 个“1”,除符号位外还剩两个“1”。为了使真值最小,应让这两个“1”放在权值最小的位置,即最低两位:

故选择 B。

  1. 【2018】假定带符号整数采用补码表示,若 int 型变量 的机器数分别是 FFFF FFDFH 和 0000 0041H,则 的值及 的机器数分别是( )。

A. 的机器数溢出
B. 的机器数为 FFFF FF9DH
C. 的机器数为 FFFF FF9EH
D. 的机器数为 FFFF FF96H

答案: C

解析:

为负数补码。其绝对值可通过按位取反再加 得到:

因此

所以

,取补码得

故选择 C。

  1. 【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。

  1. 【2021】已知带符号整数用补码表示,变量 的机器数分别为 FFFDH、FFDFH、7FFCH,下列结论正确的是( )。

A. 若 为无符号整数,则
B. 若 为无符号整数,则
C. 若 为带符号整数,则
D. 若 为带符号整数,则

答案: D

解析:

若按无符号整数解释:

故应有

A、B 均错误。

若按 16 位补码解释:

因此

选择 D。

  1. 【2022】32 位补码所能表示的整数范围是( )。

A.
B.
C.
D.

答案: B

解析:

位补码的表示范围为

时,范围为

故选择 B。

2.3 浮点数的表示和运算

  1. 【2009】浮点数加、减运算过程一般包括对阶、尾数运算、规格化、舍入和判溢出等步骤。设浮点数的阶码和尾数均采用补码表示,且位数分别为 5 位和 7 位(均含 2 位符号位)。若有两个数 ,则用浮点加法计算 的最终结果是( )。

A. 00111 1100010
B. 00111 0100010
C. 01000 0010001
D. 发生溢出

答案: C

解析:

先将两个数写成二进制规格化形式:

对阶时应使阶码相同。将 的阶码由 调整为 ,尾数右移两位:

尾数相加:

结果出现尾数溢出,需要右规一位并将阶码加

阶码 的 5 位双符号位补码为 01000,尾数 的 7 位双符号位补码为 0010001,因此最终机器数为

故选择 C。

  1. 【2011】float 型数据通常用 IEEE 754 单精度浮点数格式表示。若编译器将 float 型变量 分配到一个 32 位浮点寄存器 FR1 中,且 ,则 FR1 的内容是( )。

A. C104 0000H
B. C242 0000H
C. C184 0000H
D. C1C2 0000H

答案: A

解析:

先将 化为二进制:

因此:

  • 符号位
  • 实际指数为 ,移码阶码为
  • 尾数字段为小数点后的部分

故 IEEE 754 单精度机器数为

写成十六进制为

故选择 A。

  1. 【2012】float 类型(即 IEEE 754 单精度浮点数格式)能表示的最大正整数是( )。

A.
B.
C.
D.

答案: D

解析:

IEEE 754 单精度浮点数中:

  • 阶码字段为 8 位;
  • 阶码全为 时用于表示无穷大和 NaN;
  • 最大有限数的阶码字段为 254,对应实际指数
  • 尾数字段全为 ,有效数为

因此最大正有限数为

故选择 D。

  1. 【2013】若某数采用 IEEE 754 单精度浮点数格式表示为 C640 0000H,则该数的值是( )。

A.
B.
C.
D.

答案: A

解析:

将 C640 0000H 写成二进制:

按 IEEE 754 单精度格式划分为

因此:

  • 符号位为 ,表示负数;
  • 阶码字段 ,实际指数为
  • 有效数为

所以该数为

故选择 A。

  1. 【2014】float 型数据常用 IEEE 754 单精度浮点格式表示。假设两个 float 型变量 分别存放在 32 位寄存器 中,若 ,则 之间的关系为( )。

A. 且符号相同
B. 且符号不同
C. 且符号相同
D. 且符号不同

答案: A

解析:

两个机器数的最高位都为 ,因此 均为负数,符号相同。

对于同为负数的规格化浮点数,绝对值越大,真值反而越小。比较阶码即可看出:

  • 的阶码明显大于 的阶码,因此
  • 又因为二者均为负数,所以

故选择 A。

  1. 【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。

  1. 【2018】IEEE 754 单精度浮点格式表示的数中,最小的规格化正数是( )。

A.
B.
C.
D.

答案: A

解析:

IEEE 754 单精度规格化数的最小非零阶码字段为

其实际指数为

取最小规格化尾数 ,得到最小规格化正数

是最小非规格化正数,不是规格化数。故选择 A。

  1. 【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 项应为

  1. 【2021】下列数值中,不能用 IEEE 754 浮点格式精确表示的是( )。

A. 1.2
B. 1.25
C. 2.0
D. 2.5

答案: A

解析:

二进制浮点数能够精确表示的有限小数,其既约分数的分母必须是 的整数次幂。

这些数的分母均为 的幂,因此可以精确表示。

分母含因子 ,其二进制小数是无限循环的,不能用有限位 IEEE 754 浮点数精确表示。

故选择 A。

  1. 【2022】 的 IEEE 754 单精度浮点数表示为( )。

A. BEE0 0000H
B. BF60 0000H
C. BF70 0000H
D. C0E0 0000H

答案: A

解析:

先将绝对值化为二进制:

因此:

  • 符号位为
  • 阶码字段为
  • 尾数字段为

于是机器数为

写成十六进制为

故选择 A。

  1. 【2023】已知 float 型变量用 IEEE 754 单精度浮点数格式表示。若 float 型变量 的机器数为 8020 0000H,则 的值是( )。

A.
B.
C.
D. 非数(NaN)

答案: A

解析:

将 8020 0000H 按 IEEE 754 单精度格式划分:

符号位为 ,阶码字段全为 ,尾数字段不全为 ,因此这是一个负的非规格化数,而不是 NaN。

非规格化数的数值为

本题尾数字段为 ,故

故选择 A。

  1. 【2024】某科学实验中,需要使用大量的整型参数。为了在保证表数精度的基础上提高运算速度,需要选择合理的数据表示方法。若整型参数 的取值范围分别为 ,则下列选项中, 最适宜采用的数据表示方法分别是( )。

A. 32 位整数、32 位整数
B. 单精度浮点数、单精度浮点数
C. 32 位整数、双精度浮点数
D. 单精度浮点数、双精度浮点数

答案: C

解析:

对于

显然落在 32 位有符号整数范围

之内,而且使用整数表示可以保证所有整数均精确,因此 适合采用 32 位整数。

对于 ,其范围达到 ,超出 32 位整数范围。IEEE 754 单精度浮点数只有 24 位有效二进制位,不能保证该范围内所有整数都精确表示;双精度浮点数具有 53 位有效二进制位,可以精确表示绝对值不超过 的整数,因此能够保证 的精度。

故选择 C。

2.4 C 语言中的类型转换

  1. 【2009】一个 C 语言程序在一台 32 位机器上运行。程序中定义了三个变量 ,其中 为 int 型, 为 short 型。当 时,执行赋值语句 后, 的机器数分别是( )。

A.
B.
C.
D.

答案: D

解析:

,其 32 位补码为

,先写出 的 16 位二进制形式并取补码:

计算 时,short 型的 先进行整型提升,符号扩展为 32 位:

于是

故选择 D。

  1. 【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。

  1. 【2012】假定编译器规定 int 和 short 类型长度分别为 32 位和 16 位,执行下列 C 语言语句:
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。

  1. 【2016】有如下 C 语言程序段:
C
short si = -32767;
unsigned short usi = si;

执行上述两条语句后,usi 的值为( )。

A.
B.
C.
D.

答案: D

解析:

的 16 位补码为

赋值给 unsigned short 后,位模式保持为 8001H,只是改用无符号方式解释:

也可利用有符号数转换为同宽无符号数的模运算规则:

故选择 D。

  1. 【2019】考虑以下 C 语言代码,执行程序段后,si 的值是( )。
C
unsigned short usi = 65535;
short si = usi;

A.
B.
C.
D.

答案: A

解析:

unsigned short 的 对应 16 位机器数

将其赋给同为 16 位的 short 后,通常保持低 16 位不变,再按补码解释。FFFFH 作为 16 位补码表示

故选择 A。

  1. 【2023】若 short 型变量 ,则 的机器数是( )。

A. E002H
B. E001H
C. 9FFFH
D. 9FFEH

答案: A

解析:

先将 写成十六进制:

求 16 位补码:

因此 的机器数为 E002H,选择 A。

  1. 【2024】C 语言代码如下。执行下列代码段后, 的值是( )。
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。

  1. 【2011】假定在一个 8 位字长的计算机中运行如下类 C 程序段:
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,即按补码解释为 ,两个负数相加却得到正数,因此发生溢出。

故只有语句

C
int k2 = m + n;

发生带符号溢出。

  1. 【2017】已知

计算 的 C 语言函数 如下:

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 类型。当 时,表达式 不是 ,而是发生模 回绕:

循环条件变成

C
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 运算方法和运算电路

  1. 【2011】某机器有一个标志寄存器,其中有进位/借位标志 CF、零标志 ZF、符号标志 SF 和溢出标志 OF。条件转移指令 bgt(无符号整数比较大于时转移)的转移条件是( )。

A.
B.
C.
D.

答案: C

解析:

比较两个无符号整数 时,处理器通常执行

,应同时满足:

  1. 结果不为 ,即
  2. 减法没有产生借位,即

因此转移条件为

等价于

故选择 C。

注:原文件中的选项上划线缺失。若没有上划线,四个选项均不能正确表达“CF 与 ZF 均为 0”。

  1. 【2018】减法指令 sub R1, R2, R3 的功能为“”,该指令执行后将生成进位/借位标志 CF 和溢出标志 OF。若 ,则该减法指令执行后,CF 与 OF 分别为( )。

A.
B.
C.
D.

答案: A

解析:

按无符号数解释:

因此执行减法时不需要借位,故

按 32 位补码解释:

所以

结果在 32 位有符号整数范围内,没有溢出,故

因此选择 A。

  1. 【2023】已知 为 int 类型,当 时,执行 指令得到的溢出标志 OF 和借位标志 CF 分别为 。那么当 时,执行该指令得到的 OF 和 CF 分别是( )。

A.
B.
C.
D.

答案: B

解析:

按带符号整数计算:

在 int 的表示范围内,因此不发生有符号溢出:

判断 CF 时按无符号数解释操作数。 的 32 位补码对应一个很大的无符号数:

由于

执行无符号减法时需要借位,因此

故选择 B。

  1. 【2024】下列关于整数乘法运算的叙述中,错误的是( )。

A. 用阵列乘法器实现的乘运算可以在一个时钟周期内完成
B. 用 ALU 和移位器实现的乘运算无法在一个时钟周期内完成
C. 变量与常数的乘运算可编译优化为若干条移位及加/减运算指令
D. 两个变量的乘运算无法编译转换为移位及加法等指令的循环实现

答案: D

解析:

  • A 正确。阵列乘法器通过组合逻辑并行产生和累加部分积,在电路延迟允许的情况下可在一个时钟周期内完成乘法。
  • B 正确。若复用 ALU 和移位器,通常需要逐位判断乘数并反复执行“加法—移位”,需要多个时钟周期。
  • C 正确。例如

编译器可将常数乘法优化为移位和加减指令。

  • D 错误。两个变量的乘法同样可以通过循环检查乘数各位,并用移位与加法累加部分积来实现,只是执行速度通常较慢。

故选择 D。

  1. 【2020】有实现 的两个 C 语言函数如下:
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、移位器和寄存器实现乘法时,数据通路本身只负责执行具体的加减、移位和保存操作。控制逻辑负责协调这些部件,主要包括:

  1. 将被乘数、乘数和初始部分积装入相应寄存器;
  2. 检查乘数当前位,并决定本轮是否执行加法或减法;
  3. 控制 ALU 的运算类型;
  4. 控制被乘数、乘数或部分积寄存器的移位;
  5. 维护循环计数器,判断是否已经处理完全部 位;
  6. 在运算完成后把结果写回目标寄存器并结束乘法指令。

因此控制逻辑本质上负责产生乘法算法各步骤所需的时序控制信号。

(3)三种实现方式的速度比较

① 没有乘法指令时,编译器或运行库需要生成多条移位、条件判断、加法和循环控制指令。除了算术操作外,还要反复进行取指、译码和分支,因此执行时间通常最长。

② 使用 ALU 和移位器实现乘法指令时,乘法仍需经过多轮“判断—加法—移位”,但这些步骤在处理器内部由控制逻辑完成,减少了软件指令开销,速度通常快于情况①。

③ 阵列乘法器利用大量组合逻辑并行产生和压缩部分积,可在一个时钟周期或很少的流水级中完成乘法,执行时间通常最短。

因此:

  • 最长:没有乘法指令;
  • 最短:使用阵列乘法器实现乘法指令。

(4)乘积、返回结果与溢出判断

给定

数学乘积为

其 64 位二进制乘积为

因为两个操作数均为正数,无论使用带符号乘法指令还是无符号乘法指令,得到的完整 64 位位串都相同:

函数 umul() 将低 32 位 FFFF FFFEH 按 unsigned 解释:

该值在 32 位无符号整数范围 内,因此 umul() 的返回结果不溢出。

函数 imul() 也只返回低 32 位 FFFF FFFEH,但按 32 位补码解释为

而真实的带符号数学乘积为 ,超出 int 的范围 ,因此 imul() 发生溢出。

对于无符号 位乘法,若保留了完整的 位乘积,则只取低 位作为结果时:

  • 位全为 ,说明完整乘积小于 ,不溢出;
  • 位不全为 ,说明完整乘积不小于 ,舍弃高位会改变数值,发生溢出。

本题完整乘积的高 32 位为 0000 0000H,所以无符号乘法不溢出。