Appearance
题目
下列关于整数乘法运算的叙述中,错误的是( )。
错因
A
A 在描述阵列乘法器——纯组合逻辑电路:所有部分积的产生和累加被全部展开成并行的与门 + 加法器树,输入信号一旦稳定输出就稳定。组合逻辑的特点是"输入变 → 输出立即跟着变",所以确实可以在一个时钟周期内得出结果(代价是面积大、功耗高)。A 的叙述正确——本题问"错误的",所以不选 A。
B
B 在描述用 ALU + 移位器循环实现的乘法。ALU 一次只能做一次加/减、移位器一次移一位,做 n 位 × n 位乘法时需要循环 n 次,每次至少占 1 个时钟周期。B 的叙述正确,不选 B。
C
C 在描述编译器对"变量 × 常数"的优化——把乘法展开成移位 + 加/减:
由于常数已知,编译器在编译期就能展开成 1–3 条移位/加减指令,比通用乘法快。C 的叙述正确,不选 C。
总解析
题目问"错误的"叙述,D 是错的。
逐项核验:
| 选项 | 内容 | 对/错 | 理由 |
|---|---|---|---|
| A | 阵列乘法器 1 周期完成 | ✓ | 组合逻辑,输入稳定后输出立即稳定 |
| B | ALU + 移位器无法 1 周期完成 | ✓ | 需多周期循环,每次累加 1 位部分积 |
| C | 变量 × 常数可编译为移位+加减 | ✓ | 编译期常数展开 |
| D | 两个变量乘运算无法编译为移位+加法的循环实现 | ✗ | 完全可以——这就是无硬件乘法器场景的标准做法 |
D 错在哪里:
两个变量的乘法正是用"移位 + 加法的循环"实现的——这是无硬件乘法器场景下的经典软件实现(也是早期 8 位机做 16/32 位乘法的常见做法)。算法骨架(n 位 × n 位):
P = 0 // 累加器(部分积之和)
for i = 0 to n-1 do
if 乘数最低位 == 1 then
P = P + 被乘数 // 当前位是 1,累加被乘数
end if
被乘数 = 被乘数 << 1 // 被乘数左移 1 位
乘数 = 乘数 >> 1 // 乘数右移 1 位(取出下一位)
end for每次循环 = 1 次条件判断 + 可能 1 次加法 + 2 次移位,全部由 ALU 和移位器完成——完全是"移位 + 加法的循环"。
后来的 CPU 把这套循环用硬件展开成了"阵列乘法器"或"流水线乘法器",提速但不改变算法本质。D 把这种实现方式直接否定,所以是错的。
最终答案是 D。
乘法实现方式速记:
| 实现 | 谁做 | 多少周期 |
|---|---|---|
| 阵列乘法器(组合电路) | 硬件全展开 | 1 周期 |
| ALU + 移位器循环 | 硬件,按位累加 | n 周期 |
| 软件循环(移位 + 加) | CPU 执行通用指令序列 | 多于 n 周期 |
| 编译器常数优化 | 编译器静态展开 | 1–3 条指令搞定 |
"两个变量相乘"在没有硬件乘法器时也能做,靠的就是 D 否定掉的那个"移位 + 加"循环——所以 D 是错的。