05_整数运算

Charlie

1.算数逻辑单元ALU

  • 数据由寄存器 (Registers) 提交给ALU,运算结果也存于寄存器
  • ALU可能根据运算结果设置一些标志 (Flags),标志值也保存在处理器内的寄存器中
  • 控制器 (Control unit) 提供控制ALU操作和数据传入送出ALU的信号
    e_NVIDIA_GeForce_Overlay_DT.png

1.1全加器

  • 延迟
  • 异或基于与或非实现,因此延迟为3ty
    9_NVIDIA_GeForce_Overlay_DT.png

1.2串行进位加法器

  • 延迟
  • n=1、2时,S=6
  • 时,可以提前算好 x异或y,2(n-1)+3=2n+1
    a_NVIDIA_GeForce_Overlay_DT.png

1.3全先行进位加法器

b_NVIDIA_GeForce_Overlay_DT.png

  • 缺点:复杂
  • 延迟:c_NVIDIA_GeForce_Overlay_DT.png

1.4部分先行进位加法器

d_NVIDIA_GeForce_Overlay_DT.png

2.补码表示的整数运算

2.1加法

溢出判断:

  1. 加数符号相同,且和与两个加数符号不同(符号相反的数相加不会溢出)
  2. 符号位的进位与最高数值位的进位不同
    13_NVIDIA_GeForce_Overlay_DT.png

2.2减法

  • 硬件实现是在加法器的基础上增加一个多路选择器
    14_NVIDIA_GeForce_Overlay_DT.png

2.3乘法

布斯乘法:其中右移为算术右移

  • 一开始高位补零
    15_NVIDIA_GeForce_Overlay_DT.png
    例子:
    16_NVIDIA_GeForce_Overlay_DT.png

2.4除法

不同情形的处理

  • 若被除数为0,除数不为0:商为0
  • 若被除数不为0,除数为0:发生“除数为0”异常
  • 若被除数、除数均为0:发生“除法错”异常
  • 若被除数、除数均不为0:进行进一步除法运算
    具体实现
    18_NVIDIA_GeForce_Overlay_DT.png
    如何判断“够减”:余数是否足够“大”:
  • 如果余数除数的符号相同: 减法
  • 如果余数除数的符号不同: 加法
  • 余数变号不够减,不变号够减
  • 本质是去削减余数(一开始是被除数)绝对值,并且符号不改变
    19_NVIDIA_GeForce_Overlay_DT.png
    思考
  • -7 / 3 = -2 余 -1?(正确)
  • -7 / 3 = -3 余 2?

2.4.1恢复余数除法

步骤过程

  • 先左移,再试商
  • 最后可能要修正商的符号
    1a_NVIDIA_GeForce_Overlay_DT.png

例子
1c_NVIDIA_GeForce_Overlay_DT.png

2.4.2不恢复余数除法

掌握运算过程即可
大致思路

  • 只考虑减法(同号试商)
    • 如果余数够大
      • 左移再减去除数
    • 如果余数不够大,即余数不够减变号
      • 即先恢复余数再左移,然后减去除数

步骤过程:

  1. 通过在前面加n位符号扩展被除数,并存储在余数寄存器和商寄存器中
  2. 如果除数被除数符号相同,则做减法;否则,做加法(本质是削减余数绝对值)
    • 如果余数除数符号相同,则商= 1;
    • 否则,= 0
      注:这一步没有左移
  3. 如果余数除数符号相同,;否则,
    • 如果新的余数除数符号相同,使商为1;否则,使商为0
      注:余数乘2即为左移
  4. 重复步骤3 n次
    • 此时得到n+1位商
  5. 修正商
    • 先左移商
    • 如果此时商是负的 (被除数和除数的符号不同) ,商加1
  6. 余数被除数符号不同,修正余数
    • 被除数除数符号相同,最后余数加除数
    • 否则,最后余数减除数

例子:
1d_NVIDIA_GeForce_Overlay_DT.png

  • 标题: 05_整数运算
  • 作者: Charlie
  • 创建于 : 2023-01-13 16:35:00
  • 更新于 : 2024-07-05 12:55:04
  • 链接: https://chillcharlie357.github.io/posts/bbb50189/
  • 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。
评论