计算机组成2下-运算方法与运算器

2.2 运算方法与运算器

2.2.1 移位运算

1. 逻辑移位

移除相应位并补0。 应用举例

2.算数移位

算术移位规则

  • 算术移位的对象:有符号数(==针对定点数==,包括定点整数和定点小数)
  • 不论正数还是负数,==符号位保持不变==,仅对数值位进行移位(左移或右移)。
  • 对真值的原码、反码、补码进行算术移位后,它们各自所对应的新的真值应该保持一致。
    • 当真值为正数时,真值的原码、反码和补码都相同,因此,对它们进行算术移位后,它们各自所对应的新的真值自然是保持一致的。对于移位后出现的空位,规定添补0。若左移出1则溢出,若右移出1,则精度缺失。
    • 当真值为负数时,真值的原码、反码和补码都不同,因此,对它们进行算术移位后,为了确保它们各自所对应的新的真值保持一致,对于移位后出现的空位,添补规则各不相同。

补码移位特殊方法

  • 有符号定点数的==补码==的另一种算术移位方法,即“符号位也参与移位’具体规则如下:左移高位移除,低位添补 0移动前后若符号位发生变化,则发生溢出;右移低位移除,高位添补符号。 上述这种针对有符号定点数的补码的算术移位方法,具有以下优点:左移时,有检测出发生溢出的方法,符号位发生变化可判定溢出。符号位与数值位一起移位,方便 ALU 处理,也方便人们记忆。

C语言中的移位运算

3.循环移位

循环移位概述

  • 循环移位的对象,无符号数
    • 将无符号数二进制形式中的各个位向左或向右移动,被移出的位会重新出现在另一端,形成循环。
  • 在很多处理器架构中,循环移位指令会影响状态寄存器中的进位标志 CF (Carry Flag) 位, CF 标志位用于标识在执行算术或逻辑操作时是否发生了进位。
  • 根据 C F 标志位是否加入循环移位过程,循环移位可分为以下四种:不带 CF 标志位的循环右移、不带 CF 标志位的循环左移、带 CF 标志位的循环右移、带 CF 标志位的循环左移。

循环移位

循环移位应用

  • 循环移位的应用主要有:加密算法、哈希函数、优化算法。
    • 加密算法,通过循环移位可以实现数据的混淆和置换,增强加密算法的安全性。
    • 哈希函数通过循环移位可以用来改变输入数据的排列顺序,以产生不同的哈希值,有利于增强哈希函数的混淆性和扩散性。
    • 优化算法,在某些算法中,循环移位可以用于优化性能和节省资源。例如,在图形处理和数字信号处理中,循环移位可以用于加速算法的执行。

C语言实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
*include<stdio.h>
unsigned int circularLeftShift(unsigned int value,int n){
return (value << n)|(value >> (32-n));
}
unsigned int circularRightShift(unsigned int value,int n){
return (value >> n)|(value << (32-n));
}
int main() {
unsigned int usi
int d=4;
printf("Original value:0x%x\n",usi);
printf("Circular left shift by %d bits: 0x%x\n",d,circularLeftShift(usi,d));
printf("Circular right shift by %d bits: 0x%x\n",d,circularRightShift(usi,d));
return 0;
}

2.2.2 定点数的加法与减法运算

1. 补码加减法运算公式

公式

2. 补码加减法溢出检测

溢出

  • 计算机的字长是限的,因此所能表示的数据范围也是有限的。当运算结果超出所能表示的数据范围时,就会出现(OverfIow),溢出会导致错误的运算结果。计算机系统设计人员必须要解决溢出的检测问题,以便在发生溢出时计算机能做出相应的处理。

检测

定点数补码加减运算判断溢出的方法主要有以下 3 种:

  1. 根据操作数的符号位与运算结果的符号位是否一致进行判断;
  2. 根据运算过程中最高数值位的进位与符号位的进位是否一致进行判断,不同即产生溢出; \[OF=C_{n-1}\oplus C_{n}\]
  3. 利用变形补码(具有 2 位符号位的补码)的符号位进行判断。 \[OF=C_{n+1}\oplus C_{n}\]

3. 串行进位加法器

加减器的构成

4. 先行进位加法器

2.2.3 定点数的乘法运算

1. 无符号数乘法运算的硬件逻辑实现

2. 原码乘法运算的硬件逻辑实现

由于原码表示与无符号数非常类似,仅比无符号数多一个符号,而乘积的符号可以通过参与运算的两个数各自符号的逻辑异或求得,因此,上述无符号数乘法运算的硬件逻辑实现,可用于原码一位乘法(每次乘一位),仅需添加符号位处理即可。

注:尽管寄存器都换成了5位,但是仍然是计算4次。舍弃MQ最后一位,结果应是1,0100 01111。

根据乘数中的两位来计算位积,可以大大提升乘法的运算速度,这种乘法称为二位乘法,有兴趣的同学可以查阅相关资料。

3. 补码乘法运算的硬件逻辑实现

计算机中采用补码表示数据为原码、运算后还需要将原码再转换为补码,这样会增加许多操作步骤。为了减少处理环节,英国的布斯 (Booth) 夫妇于 1950 年提出了一种补码乘法,又称为==Booth算法==。 X取双符号位,应对非溢出结果大于2的情况。==切记右移补位用符号位。== 例题

4. 无符号阵列乘法器

原码、补码一位乘法的硬件逻辑实现,需要在时钟节拍下、通过控制逻辑的控制,执行相应轮次的“加法、右移“操作来实现,速度较慢。为了提高运算速度,可以仅采用组合逻辑电路以专用硬件方式构建阵列乘法器。构建阵列乘法器的基本思想是模仿二进制乘法的笔算方法。

  • 阵列乘法器结构规范,标准化程度高,有利于布局布线,适合用超大规模集成电路实现,且可以获得较高的运算速度,其运算速度仅取决于逻辑门和加法器的传输延迟。

5. 补码阵列乘法器

(待补)

2.2.4 定点数的除法运算

1. 原码除法运算-恢复余数法

  • 由于原码表示与无符号数非常类似,仅比无符号数多一个符号,因此,进行原码除法运算时,可将符号位与数值部分分开处理。
    • 商的符号:由被除数和除数各自的符号进行异或运算求得;
    • 商的数值部分:由被除数和除数各自的数值部分(即真值的绝对值)相除求得。
  • 结果的位数与除数位数一致。

2. 原码除法运算-不恢复余数法

  • 最后一次运算上商时,若余数小于 0 ,此时虽然所有上商位都已经得到了,但负余数还需要加上除数,恢复成正数。
  • 不难发现,==上商位与进位位的值是相同的==。因此,在硬件逻辑实现时,可用加法器的进位输出作为上商的控制信号以及可控加减法电路的控制信号。
  • ==注意使用的仍是绝对值的补码==。Qi的正负是指移位之前的。

3. 补码除法运算-不恢复余数法(加减交替法)

  • 与原码除法将符号位和数值部分分开处理不同,补码除法将符号位和数值部分一起参加运算,商符是在求商的过程中自然形成的。因此,补码除法的运算方法没有原码除法的运算方法直观,需要解决以下 3 个主要问题:
    • 如何确定商值
    • 如何形成商符
    • 如何得到新余数

2.2.5 浮点运算

1. 浮点加减法运算

  • 在尾数右规时,尾数末位的几位会因超出计算机字长而被丢弃,从而产生误差。此时,计算机可以按选定的方式进行舍入操作。
  • 在尾数规格化和尾数舍入时,可能会对结果的阶码执行加、减运算。因此,必须考虑结果的阶码出现溢出的问题。O 由于浮点数中阶码的位数决定了浮点数的表示范围,因此,对于浮点运算,当阶码出现溢出时,表示运算结果出现溢出。
  • 采用 0 舍 1 入的舍入操作,若破坏规格化结果,则还需要再次进行规格化处理。
  • 取相反数时,需要考虑保留位 3-5-1 浮点运算 — 浮点加减法运算_哔哩哔哩_bilibili

2. IEEE 754浮点加减法运算

(待补)

3. 浮点乘法运算

4. 浮点除法运算

2.2.6 运算器

通过本章中前面各节课的介绍可知:

  • 计算机中的各类算术运算都以利用基本的定点加法运算移位运算来实现。
  • 将实现加法运算、移位运算、逻辑运算以及各种算术运算所需的数字逻辑电路集成在一起,就可以构成 cpu 中的运算器。 运算器一般分为以下两种,
  • 定点运算器:以算术逻辑单元 ALU 为核心,可以进行定点数的移位、算术、逻辑运算。
  • 浮点运算器:以浮点运算单元 FPU 为核心,负责进行浮点数的算术运算。 浮点运算比定点运算复杂得多,因此,实现浮点运算的逻辑电路也比较复杂,早期将其实现电路集成在一个单独的芯片中,目前大多集成在 cpu 内部。

计算机组成2下-运算方法与运算器
https://eleco.top/2025/05/05/计算机组成2下-运算方法与运算器/
作者
Eleco
发布于
2025年5月5日
许可协议