计算机组成原理 | 带符号整数除法原理 计算机底层硬核科普带符号除法一场“看脸色行事”的减法游戏大家好今天我们要攻克《计算机组成原理》中的大 Boss——带符号整数除法。很多同学在学到这里时会晕为什么无符号除法只要一直减就行带符号除法却一会儿加、一会儿减其实为了处理正负号CPU 采用了一种极其聪明的策略补码不恢复余数法也叫加减交替法。它的核心逻辑不再是单纯的“够减就减”而是变成了“看符号决定加减看变化决定商值”。准备好了吗让我们完全按照底层的运算逻辑拆解一下这个过程 第一步运算前的初始化与“安检”在 CPU 开始计算前我们需要把数据安顿好并进行一轮严格的“安检”。假设我们要算 A/Bn 位除以 n 位被除数 (A)➡️ 放入寄存器组[R, Q]。注意如果是单精度除法被除数需要先进行符号扩展变成 2n 位放入 R 和 Q如果是双精度直接放入即可。除数 (B)➡️ 放入寄存器[Y]。计数器 Cn➡️ 设置为n代表我们要循环 n 次。⚠️ 特殊情况检查保命环节在正式动手前硬件电路会先判断三个“生死攸关”的问题能不能直接出结果如果|被除数| |除数|那还算什么直接判定商0余数被除数。除法器立刻下班不必再执行后续步骤。除数是不是 0如果除数 Y 0这是数学界的禁忌系统会立即触发“除数为 0”异常停止运算呼叫操作系统来报错。会不会溢出这是一个高频考点。对于补码的单精度除法n bit ÷ n bit只有一种极端情况会导致商溢出“绝对值最大的负数 ÷ -1”。原理比如 8 位补码中-128 的补码是10000000而 -1 的补码是11111111。(-128)/(-1)128。但是8 位补码能表示的最大正数只有 127。128 装不下 这就是溢出。 第二步N 轮“加减交替”循环如果通过了安检CPU 就会进入核心的n 轮循环。每一轮的操作都严格遵循以下三步曲1. 左移与上商准备首先将寄存器组[R, Q] 整体左移一位。R 的最高位移出丢弃或保存。Q 的最高位移入 R 的最低位。Q 的最低位空出来准备填入这一轮的“商”。2. 决定加减同号减异号加这是最关键的一步控制逻辑会观察中间余数R与除数Y的符号关系若 R 与 Y 同号执行R R - Y做减法。若 R 与 Y 异号执行R R Y做加法。通俗理解这就好比你要把余数往 0 的方向拉。如果余数和除数同号说明方向反了要减去一个除数来抵消如果异号说明方向对了加上一个除数相当于减去一个负数来逼近 0。3. 决定商值看符号变没变运算完成后观察新余数与除数的符号关系若符号不变说明刚才的操作是有效的够减了或者加对了商上 1。若符号改变说明刚才的操作过头了不够减或者加多了商上 0。4. 循环结束计数器 Cn 减 1。当 Cn 0 时循环结束。此时寄存器 [Q]中保存的就是商。寄存器 [R]中保存的就是余数。(注如果需要精确的余数最后通常还需要根据商的符号对余数进行一次修正但这属于后处理阶段上述流程是核心的求商过程) 第三步实战演示5 个例子为了让大家彻底看懂我们设定机器字长为4 位含 1 位符号位即 n3数值位 3 位。除数 Y 2补码为0010。被除数 A根据不同情况变化。✅ 案例 1正常情况同号相除题目6/20110 / 0010预期结果商 3 (011)余 0初始化R0000符号扩展, Q0110, Y0010。第 1 轮左移R0000, Q110_(空位待填)。判断R(0000) 与 Y(0010)同号。运算R R - Y 0000-00101110(即 -2)。定商新 R(1110) 与 Y(0010)符号变了-商 0。状态Q1100。第 2 轮左移R1101, Q100_。判断R(1101, 负) 与 Y(0010, 正)异号。运算R R Y 110100101111(即 -1)。定商新 R(1111) 与 Y(0010)符号变了-商 0。状态Q1000。第 3 轮左移R1111, Q000_。判断R(1111, 负) 与 Y(0010, 正)异号。运算R R Y 111100100001(即 1)。定商新 R(0001) 与 Y(0010)符号没变-商 1。5. 第 4 轮左移R0010, Q001_。判断R(0010, 正) 与 Y(0010, 正)同号。运算R R - Y 0010-00100000定商新 R(0000) 与 Y(0010)符号没变-商 1。6/2 30011余数为0 结果正确✅️✅ 案例 2正常情况异号相除题目-6/21010 /0010预期结果商 -3 (101)余 0初始化R1111(符号扩展), Q1010, Y0010。第 1 轮左移R1111, Q010_。判断R(1111, 负) 与 Y(0010, 正)异号。运算R R Y 111100100001。定商新 R(0001) 与 Y(0010)符号不变-商 1。后续轮次随着计算进行商会逐渐形成101的模式最终得到 -3。核心点因为被除数是负的第一步必然是“异号加”试图把余数往正方向拉。⚠️ 案例 3特殊情况直接出结果题目2/60010 / 0110判断|被除数| (2) |除数| (6)。结果不需要进入循环。硬件直接输出商0余数2。意义节省时钟周期避免无效计算。⚠️ 案例 4特殊情况除数为 0题目5 / 0判断检测到 Y 0000。结果触发Zero Divide Exception。CPU 暂停当前进程跳转到操作系统的中断处理程序通常会弹出一个“运行时错误”或者导致程序崩溃。⚠️ 案例 5特殊情况溢出题目4 位补码下-8 / -11000 /1111背景4 位补码范围是 -8 ~ 7。数学计算。问题8 的二进制是1000但在补码里1000代表 -8正数 8 根本存不下需要 5 位01000。结果发生Overflow溢出。如果不处理你会得到一个错误的负数结果。 第四步408 / 高校期末真题演练最后我们来一道经典的考研/期末风格题目检验一下学习成果。【真题模拟】某计算机采用补码加减交替法不恢复余数法进行定点整数除法运算。机器字长 n5 位含 1 位符号位。已知被除数X-7 除数Y2 。 请回答写出 X 和 Y 的补码表示。在进行除法运算前需要进行哪些特殊判断结果如何简述第一步运算中R 和 Y 的符号关系及对应的操作。【参考答案与解析】1. 补码表示X-7。原码10111- 反码11000- 补码11001。Y2。补码00010。[-Y]补用于减法对 Y 取反加 1 -111010000111110。2. 特殊判断判零Y!0通过。判溢出X绝对值7Y绝对值2。不是“最小负数除以 -1”的情况不会溢出。判大小72不能直接得结果需进入循环。初始化被除数需符号扩展为双字长放入 [R, Q]。R 11111(X 的符号位扩展)Q 11001(X 的数值部分)3. 第一步运算分析左移[R, Q] 左移一位。R 变为11111(最高位丢弃Q 的最高位 1 移入 R 最低位)Q 变为1001_。判断符号此时 R 为11111(负数)Y 为00010(正数)。异号相加因为 R 与 Y异号所以执行加法操作。计算RRY111110001000001。上商判断新余数 R (00001, 正) 与 除数 (00010, 正)符号不变因此商上 1。