
计算机底层硬核科普无符号整数除法一场“步步为营”的减法游戏 大家好今天我们继续深入《计算机组成原理》。上一期我们聊了乘法计算机组成原理 | 原码一位乘法运算方法计算机组成原理 | 补码一位乘法运算方法计算机组成原理 | 实现乘法运算的三种方式今天我们要挑战它的逆运算——无符号整数除法。很多人觉得除法比乘法难因为乘法可以一直“加”而除法要“试”。在计算机底层做除法其实就像小时候列竖式一样是一个不断“左移、比较、做减法”的过程。准备好了吗让我们拆解一下这个让 CPU 既爱又恨的算法 核心概念什么是“精度”在开始之前我们要先搞清楚两个术语别被绕晕了双精度除法想象你有2n位的被除数比如 64 位去除了一个n位的除数比如 32 位。结果你会得到一个n位的商和一个n位的余数。风险是这种情况下商是有可能溢出的也就是商太大了寄存器装不下。单精度除法被除数和除数都是n位。结果商和余数也都不会超过n位。优势是这种情况下商不可能溢出除非除数为0。数学铁律无论怎么算永远满足公式被除数 商 × 除数 余数 准备工作把演员请上台在 CPU 开始计算前我们需要把数据安顿好。假设我们要算A/B 除数 (B)➡️ 放入寄存器 Y。被除数 (A)➡️ 放入寄存器组[R, Q]。注这里 R 存高位Q 存低位。如果是单精度通常要把 R 清零。计数器 Cn➡️ 设置为n代表我们要循环 n 次。⚠️特殊情况检查保命环节如果除数 Y 0完蛋了触发“除数为0”异常。这时候 CPU 会立刻停止呼叫操作系统来“救场”通常是报错或崩溃。如果被除数 除数这题太简单了商直接是 0余数就是被除数自己。除法单元直接下班不用算了。 核心大戏1n 轮处理这是最精彩的部分为什么是1n轮因为第一轮是用来判断会不会溢出的后面n轮才是正经算商的。 第 0 轮生死时速溢出判断这一轮非常特殊它决定了除法能不能继续。操作将被除数的高位部分R减去除数Y。即计算R-Y 。判断如果够减结果为正说明被除数的高位比除数还大这意味着商肯定大于2^n-1 寄存器装不下了。后果发生“商溢出”异常除法终止。如果不够减结果为负说明安全商不会溢出。后果必须恢复余数把刚才减去的 Y 加回来变回原来的 R然后直接进入下一轮正式计算。 第 1 ~ n 轮正经干活求商接下来的每一轮都在做三件事左移、减法、上商。左移将 [R, Q] 整体左移一位。这就好比我们在草稿纸上做除法时把被除数的下一位“落下来”。此时 Q 的最低位空出来了准备填商。做减法用新的 R 减去除数 Y。即 R-Y。上商关键一步如果够减结果为正说明这一位商是1。把 Q 的最低位设为 1R 保持减法后的结果不用恢复。如果不够减结果为负说明这一位商是0。把 Q 的最低位设为 0并且必须恢复余数把刚才减去的 Y 加回来让 R 变回减法前的样子。这就是经典的恢复余数法。计数计数器 Cn 减 1。当 Cn 变为 0 时除法结束此时Q 里存的是商R 里存的是余数。 举个栗子手把手教你算假设我们要计算 7/2 。设 n4。被除数 X 0111放入 [R, Q]初始 R0000, Q0111。除数 Y 0010。 第 0 轮溢出检测动作R-Y 0000-0010。结果不够减负数。说明没溢出安全恢复余数R 变回 0000。进入下一轮。 第 1 轮左移[R, Q] 左移一位。R0000, Q111_空位。减法R-Y0000-0010。结果不够减。上商商0。Q 变为 1110。恢复R 恢复为 0000。 第 2 轮左移[R, Q] 左移一位。R0001, Q110_。减法R-Y0001-0010。结果不够减。上商商0。Q 变为 1100。恢复R 恢复为 0001。 第 3 轮左移[R, Q] 左移一位。R0011, Q100_。减法R-Y0011-0010。结果够减上商商1。Q 变为 1001。保留R 保持 0001不需要恢复。 第 4 轮左移[R, Q] 左移一位。R0010, Q001_。减法R-Y0010-0010。结果够减上商商1。Q 变为 0011。保留R 保持 0000。 结束计数器为0商 (Q)0011(十进制 3)。余数 (R)0001。验证7/23 余1。完美 考研 / 期末 真题演练光看不练假把式来做两道经典题目热热身 题目一基础概念题【单选】在原码恢复余数除法运算中若某次余数为负则下列说法正确的是A. 商上 1余数左移一位B. 商上 0余数左移一位C. 商上 0恢复余数然后左移一位D. 商上 1恢复余数然后左移一位✅答案C解析这是恢复余数法的核心口诀“不够减商0加回除数恢复再左移”。如果选了 B你就忘了“恢复余数”这一步下次计算就会出错啦 题目二408 风格计算题设机器字长 5 位含1位符号位但在本题无符号除法中视为纯数值位x13y3。采用原码恢复余数法进行除法运算求商和余数。✅参考思路与解答转二进制x01101,y00011 。初始化R00000,Q01101 ,Y00011 。第0轮R-Y0恢复无溢出。第1轮左移R00000R-Y0商0恢复。第2轮左移R00001R-Y0商0恢复。第3轮左移00011R-Y0商1不恢复。第4轮左移R00000R-Y0商0恢复。第5轮左移R00001R-Y0商0恢复。最终结果商 (Q)00100(十进制 4)余数 (R)00001(十进制 1)验证13/34 余1。完全正确