🧮计算机乘法大揭秘:CPU是如何做乘法的?
大家好!👋
你有没有想过,当我们在代码里写下a * b的时候,那个只有0和1的冷冰冰的CPU,到底是怎么把这两个数乘起来的?
难道它背了九九乘法表?🤔
当然不是!它用的是一种最朴实无华,却又充满智慧的方法------"累加与移位" 。今天,我们就来扒一扒计算机组成原理中关于无符号整数乘法(也就是原码一位乘法的核心逻辑)的底层秘密!🕵️♂️
如果你在阅读本篇时感觉有点"卡顿",或者对某些术语感到似曾相识却又想不起来,建议先去复习一下我往期发布的"基础装备"系列。磨刀不误砍柴工,掌握以下前置知识,会让你的学习体验丝滑如德芙:
准备好了吗?系好安全带,我们要发车了!🚀
⚙️ 硬件大揭秘:谁在干活?
在开始运算之前,我们需要召集几位"硬件干将":

-
被乘数寄存器 (X) :存放那个固定的被乘数,它是个老实人,全程不动。
-
乘数寄存器 (Y) :存放乘数,我们要盯着它的每一位看。
-
乘积寄存器 (P) :用来存中间结果,一开始是空的(全0)。
-
进位触发器 (C) :专门负责记录加法产生的进位。
-
计数器 (Cn) :像个倒计时器,记录还要做几次运算(如果是n位数,就设为n)。
-
ALU (算术逻辑单元) :真正的计算核心,负责做加法。
🏃♂️ 运算过程:一场 n 轮的接力赛
假设我们要计算两个 n 位的二进制数相乘,CPU 会开启一个循环,重复 n 次。
(这里乘数与被乘数的位数可以不相同,计算前向高位对齐即可,
类似于浮点数运算的对阶操作)
准备工作:
-
被乘数放入 X,乘数放入 Y。
-
P 寄存器清零。
-
计数器 Cn 设为 n。
比赛开始!(重复 n 轮)
-
第一步:看脸色行事 👀
-
盯着乘数寄存器 Y 的最低位(最后一位)。
-
如果是 1:控制逻辑大喊一声"加法!",ALU 就把 P 和 X 加起来,结果放回 P。(如果有进位,C 就记下来)。
-
如果是 0:控制逻辑说"休息",P 保持不变。
-
-
第二步:整体大挪移 ➡️
-
这是最关键的一步!将 [C, P, Y] 视为一个整体,向右移动一位。
-
这意味着:C 的内容移入 P 的最高位,P 的最低位移入 Y 的最高位,Y 的最低位被"挤"出去扔掉(因为它已经处理完了)。
-
-
第三步:倒计时减一 ⏳
-
计数器 Cn 减 1。
-
如果 Cn 不为 0,回到第一步继续;如果 Cn 为 0,比赛结束!
-
📌 举个栗子:3 × 5 是怎么算的?
为了让大家看明白,我们不用复杂的32位数,假设机器字长 n=4,我们来算算 3 × 5。

-
被乘数 X = 0011 (二进制 3)
-
乘数 Y = 0101 (二进制 5)
-
初始 P = 0000
-
计数器 Cn = 4
第 1 轮:

-
看 Y 的末位 :是 1。
-
加法:P + X = 0000 + 0011 = 0011。P 变为 0011。
-
右移:[P, Y] 整体右移。
- P 变为 0001,Y 变为 1010(P的末位1移到了Y的最高位)。
-
计数:Cn = 3。
第 2 轮:

-
看 Y 的末位 :是 0。
-
加法:不加,P 保持 0001。
-
右移:[P, Y] 整体右移。
- P 变为 0000,Y 变为 1101。
-
计数:Cn = 2。
第 3 轮:

-
看 Y 的末位 :是 1。
-
加法:P + X = 0000 + 0011 = 0011。P 变为 0011。
-
右移:[P, Y] 整体右移。
- P 变为 0001,Y 变为 1110。
-
计数:Cn = 1。
第 4 轮:

-
看 Y 的末位 :是 0。
-
加法:不加,P 保持 0001。
-
右移:[P, Y] 整体右移。
- P 变为 0000,Y 变为 1111。
-
计数:Cn = 0,结束!
最终结果:
-
乘积的高位在 P (0000),低位在 Y (1111)。
-
合起来就是 0000 1111,也就是十进制的 15。
-
完美!🎉
🚦 结局与溢出:是福还是祸?
运算结束后,我们会得到一个 2n 位的结果(由 P 和 Y 拼成)。
-
关于结果:通常我们只保留低 n 位(也就是 Y 里的内容)作为最终结果。
-
关于溢出 (Overflow):
-
如果高位 P 不全为0 ,说明结果太大了,低 n 位装不下,发生了溢出。
-
这时候,CPU 会把溢出标志位 OF 置为 1。
-
程序员的选择:
-
摆烂:假装没看见,直接用错的结果(有时候在某些算法里是允许的)。
-
不摆烂:在乘法指令后加一条"溢出自陷指令",一旦 OF=1,就触发异常处理程序,比如报错"数值过大"。
📝 408 & 期末 模拟小测验
光看不练假把式,来试试这几道题,看看你是不是真的懂了!
**题目 1 (基础题):**在无符号数乘法运算中,若乘数寄存器 Y 的当前最低位为 0,则本周期内硬件应执行的操作是?
A. P + X,然后右移 B. P + 0,然后右移
C. 仅右移,不加法 D. 仅加法,不右移
**题目 2 (进阶题):**字长为 8 位的 CPU 进行无符号乘法运算。若运算结束后,乘积高位寄存器 P 的值为 00000001,则说明?
A. 运算结果正确,无溢出 B. 发生了溢出,OF=1
C. 乘数 Y 的最低位一定是 1 D. 计数器 Cn 还没减到 0
**题目 3 (计算题):**若 X = 0010 (2), Y = 0011 (3),请简述第一轮加法操作后,P 寄存器的值是多少(右移前)?
答案揭晓:
-
C (遇到0,什么也不做,直接准备移位)
-
B (P 不全为0,说明结果超过了8位能表示的范围,溢出!)
-
0010 (第一轮Y末位是1,P初始为0,0+X=0010)