当前位置: 首页 > news >正文

计算机组成原理(9) - 整数的乘除法运算

计算机中整数的乘除法运算与数学中的乘除法原理类似,但受限于硬件结构(如寄存器位数、运算单元设计),其底层实现需要通过特定的算法和硬件逻辑完成。

一、整数乘法运算

计算机中的整数乘法以二进制为基础,核心是通过 “移位 + 加法” 模拟乘法过程,再结合硬件优化提升效率。

1. 无符号整数乘法:移位相加法

二进制乘法的本质是 “部分积累加”,与十进制乘法类似。例如计算 1010(10)× 0110(6)

  1010
× 0110
------0000   (1010 × 0,左移0位)1010    (1010 × 1,左移1位)
1010     (1010 × 1,左移2位)
0000      (1010 × 0,左移3位)
------
111100    (累加结果:60)

硬件实现时,步骤如下:

  • 初始化:用一个寄存器存储被乘数(M),一个寄存器存储乘数(Q),一个累加器(A)初始化为 0,总结果位数为 M位数 + Q位数(如 32 位 ×32 位 = 64 位结果)。
  • 迭代运算:对乘数的每一位(从最低位开始):
    • 若当前位为 1,则将被乘数左移对应位数后加到累加器;
    • 若为 0,则累加器不变;
  • 结果整合:累加器的值即为最终乘积。

2. 有符号整数乘法:补码乘法

计算机中整数通常用补码表示,有符号数的乘法需要处理符号位。常见方法有两种:

  • 符号位单独处理:先计算绝对值的乘积,再根据乘数和被乘数的符号(同号为正,异号为负)确定结果符号。
  • 布斯算法(Booth's Algorithm):直接对补码进行运算,无需单独处理符号,优化了运算步骤(尤其适合乘数中连续 0 或 1 较多的场景)。

硬件乘法器结构
  • 组合逻辑乘法器:用大量加法器并行计算所有部分积,速度快但硬件成本高(适合低位数乘法,如 8 位 ×8 位)。
  • 时序逻辑乘法器:通过移位寄存器和加法器分步骤迭代计算,硬件简单但耗时较长(需 n 个周期完成 n 位乘法)。
  • 现代优化:高性能处理器(如 x86、ARM)采用 “Wallace 树” 或 “Dadda 树” 结构,通过并行累加部分积缩短延迟,32 位乘法可在 1-3 个时钟周期内完成。

二、整数除法运算

除法是乘除法中更复杂的运算,核心是 “减去除数并迭代求商”,硬件实现需处理余数、商的生成及溢出问题。

1. 无符号整数除法:恢复余数法与加减交替法

除法的本质是 “重复减去除数,统计次数”,但直接减法效率低,硬件中常用优化算法:

(1)恢复余数法

步骤:

  1. 初始化:被除数存于寄存器 A(高位)和 Q(低位,商的存储位置),除数存于 BA 初始为 0。
  2. 迭代(共 n 次,n 为除数位数):
    • 将 A-Q 整体左移 1 位(相当于被除数左移,高位进入 A);
    • 若 A ≥ B,则商的当前位(Q 的最低位)置 1,A = A - B
    • 若 A < B,则商的当前位置 0,A 保持不变(“恢复” 余数)。

示例:10(1010)÷ 3(0011),最终商为 3(0011),余数为 1(0001)

(2)不恢复余数法(加减交替法)

优化恢复余数法的冗余步骤:

  • 若当前余数 A ≥ 0,商的当前位置 1,左移后减去除数(A = (A << 1) - B);
  • 若当前余数 A < 0,商的当前位置 0,左移后加上除数(A = (A << 1) + B);
  • 最终若余数为负,需加除数恢复正确余数。

该方法无需 “恢复” 余数,步骤更简洁,是硬件除法的主流实现方式。

(2)不恢复余数法(加减交替法)

优化恢复余数法的冗余步骤:

  • 若当前余数 A ≥ 0,商的当前位置 1,左移后减去除数(A = (A << 1) - B);
  • 若当前余数 A < 0,商的当前位置 0,左移后加上除数(A = (A << 1) + B);
  • 最终若余数为负,需加除数恢复正确余数。

该方法无需 “恢复” 余数,步骤更简洁,是硬件除法的主流实现方式。

2. 有符号整数除法

与乘法类似,有符号数除法需处理符号

  • 符号位规则:商的符号 = 被除数符号 ⊕ 除数符号(同号为正,异号为负);余数符号与被除数相同。
  • 运算过程:先将被除数和除数取绝对值运算,再根据符号规则调整商和余数的符号。

例如:(-10) ÷ 3,绝对值运算得商 3、余数 1,最终商为 -3,余数为 -1(与被除数同号)。

3. 除法中的特殊问题与处理
  • 溢出:当商超过结果寄存器的最大表示范围时(如 32位除法中,商 > 2^31-1),硬件会触发溢出标志(OF),通常通过异常处理(如程序中断)。
  • 除数为 0:硬件无法计算,会触发除法错误异常(如 x86 的 #DE 异常),由操作系统捕获处理(如终止程序)。
  • 余数处理:整数除法默认 “向零取整”(如 5 ÷ 2 = 2-5 ÷ 2 = -2),部分场景需特殊处理(如四舍五入)时需软件额外计算。

http://www.dtcms.com/a/337989.html

相关文章:

  • js计算两个经纬度之间的角度
  • Python字符串连接与合并工程实践:从基础到高性能解决方案
  • 【笔记】位错的定义和分类
  • B站 韩顺平 笔记 (Day 22)
  • 【人工智能】2025年AI代理失控危机:构建安全壁垒,守护智能未来
  • 规避(EDR)安全检测--避免二进制文件落地
  • 面向对象爬虫进阶:类封装实现高复用爬虫框架​
  • DP-v2.1-mem-clean学习(3.6.9-3.6.12)
  • Python 爬虫实战:玩转 Playwright 跨浏览器自动化(Chromium/Firefox/WebKit 全支持)
  • 嵌入式第三十二课!!线程间的同步机制与进程间的通信(IPC机制)
  • PotPlayer使用AI生成字幕和API实时翻译
  • Redis中LRU与LFU的底层实现:字节级的精巧设计
  • 树莓派安装python第三方库如keras,tensorflow
  • day35-负载均衡
  • 智能化合同处理与知识应用平台:让合同从 “管得住” 到 “用得好”
  • C15T3
  • openssl加密里面的pem格式和rsa有什么区别?
  • 财务分析师如何提升自身专业能力:突破职业瓶颈的五年进阶规划
  • nestjs配置@nestjs/config 入门教程
  • 股票常见K线
  • 群晖nas中 打开PHP连接MariaDB 功能扩展
  • JavaSE——高级篇
  • 处理手表步数和分析用户步数数据
  • 【Tech Arch】Spark为何成为大数据引擎之王
  • 电子电气架构 --- 关于整车信息安全的一些思考
  • 2025年- H98-Lc206--51.N皇后(回溯)--Java版
  • CC攻击的安全防护方案
  • MySQL索引设计:高效查询与资源平衡指南
  • Deep Plug-And-Play Super-Resolution for Arbitrary Blur Kernels论文阅读
  • Spring Cloud LoadBalancer 最佳实践