运算方法和运算部件
基本运算部件
高级程序语言涉及到的运算(C语言)
- C语言基本的数据类型与运算类型
- 基本数据类型
- 基本运算类型:算术,按位,逻辑,移位,扩展和截断,匹配
- 计算机如何实现高级语言程序中的运算?
- 将各类表达式编译(转换)为指令序列
- 计算机直接执行指令来完成运算

- 数据的运算
- 高级程序中涉及的运算
整数算术运算,浮点数运算,按位,逻辑,移位,位扩展,位截断
算术运算难实现

串行进位加法器(CRA)


并行进位加法器(CLA)


- 局部(单级)先行进位加法器

- 多级先行进位加法器



带标志加法器

算数逻辑部件(ALU)



定点数运算
定点数加减运算
- 原码加减运算
- 用于浮点数尾数运算(注意:浮点数加减运算时,要先对齐阶码)
- 符号位和数值部分分开处理
- 仅对数值部分进行加减运算,符号位起判断和控制作用
- 规则如下:
- 比较两数符号,对加法实行“同号求和,异号求差”,对减法实行“异号求和,同号求差”。
- 求和:数值位相加,和的符号取被加数(被减数)的符号。若最高位产生进位,则结果溢出。
- 求差:被加数(被减数)加上加数(减数)的补码。
- 最高数值位产生进位表明加法结果为正,所得数值位正确。
- 最高数值位没产生进位表明加法结果为负,得到的是数值位的补码形式,需对结果求补,还原为绝对值形式的数值位。
- 差的符号位
- 情况下,符号位取被加数(被减数)的符号;
- 情况下,符号位为被加数(被减数)的符号取反。
- 补码加减运算
- n位整数加减运算器
先看一个C程序段:
int x=9, y=-6, z1, z2;
z1=x+y;
z2=x-y;
问题:上述程序段中,x和y的机器数是什么?z1和z2的机器数是什么?
回答:
因此,计算机中需要有一个电路,能够实现以下功能:
已知 [x]补 和 [y]补 ,计算[x+y]补 和 [x-y]补 。根据补码定义,有如下公式:

Cin对于做减法不可或缺, 等于那Sub的值补充了+1
溢出问题
加数类型 | 符号位进位 | 最高位进位 | 是否溢出 |
两个正数或一正一负 | 0 | 0 | 0 |
两个正数 | 0 | 1 | 1 |
两个负数 | 1 | 0 | 1,变为正数,溢出 |
两个负数 | 1 | 1 | 0 |





- 移码加减运算

定点数乘法运算
- 无符号数运算
- 无符号数
- 32位乘法的运算实现
- 被乘数寄存器X:存放被乘数
- 乘积寄存器P:开始置初始部分积P0 = 0;结束时,存放的是64位乘积的高32位
- 乘数寄存器Y:开始时置乘数;结束时,存放的是64位乘积的低32位
- 进位触发器C:保存加法器的进位信号
- 循环次数计数器Cn:存放循环次数。初值32,每循环一次,Cn减1,Cn=0时结束
- ALU:乘法核心部件。在控制逻辑控制下,对P和X的内容“加”,在“写使能”控制下运算结果被送回P,进位位在C中
- 无符号数举例

手工乘法的特点

计算机内部稍作以下改进:(i从右n向左1排列)





- 原码乘法运算
- 用于浮点数尾数乘运算
- 两位乘法
- 举例
符号与数值分开处理:符号位异或得到,数值用无符号乘法运算

这里采用的是一位乘法
一位乘法:每次只取乘数的一位判断,需n次循环,速度慢。
两位乘法:每次取乘数两位判断,只需n/2次循环,快一倍。


- 补码乘法运算
用于对什么类型数据计算?带符号整数!如int型

Booth算法的实质

例子

补码中也有两位运算
- 快速乘法器
定点数除法运算
- 先想想纸笔怎么算

手算除法的基本要点
① 被除数与除数相减,够减则上商为1;不够减则上商为0。
② 每次得到的差为中间余数,将除数右移后与上次的中间余数比较。用中间余数减除数,够减则上商为1;不够减则上商为0。
③ 重复执行第②步,直到求得的商的位数足够为止。
- 定点除法运算
- 除前预处理
- 若被除数=0且除数≠0,或定点整数除法时|被除数|<|除数|,则商为0,不再继续
- 若被除数≠0、除数=0,则发生“除数为0”异常(浮点数时为∞)
- 若浮点除法被除数和除数都为0,则有些机器产生一个不发信号的NaN,即“quiet NaN”
- 计算机内部无符号数除法运算
- 与手算一样,通过被除数(中间余数)减除数来得到每一位商,够减上商为1;不够减上商为0(从msb→lsb得到各位商)
- 基本操作为减(加)法和移位,故可与乘法合用同一套硬件
- 两个n位数相除的情况:
- 第一次试商为1时的情况
- 问题:第一次试商为1,说明什么?商有n+1位数,因而溢出!
- 通常意义下,若是2n位除以n位的无符号整数运算,则说明将会得到n+1位的商,因而结果“溢出”(即:无法用n位表示商)。
- 若是两个n位数相除,被除数高位扩展0,则第一位商为0,肯定不会溢出
- 硬件实现
- 除数寄存器Y:存放除数。
- 余数寄存器R:初始时高位部分为高32位被除数;结束时是余数。
- 余数/商寄存器Q:初始时为低32位被除数;结束时是32位商。
- 循环次数计数器Cn:存放循环次数。初值是32,每循环一次,Cn减1,当Cn=0时,除法运算结束
- ALU:除法核心部件。在控制逻辑控制下,对于寄存器R和Y的内容进行“加/减”运算,在“写使能”控制下运算结果被送回寄存器R。
- 举例
- 不恢复余数除法(加减交替法)
只有当被除数和除数都≠ 0,且商≠ 0时,才进一步进行除法运算。
(1)定点正整数(即无符号数 )相除:在被除数的高位添n个0
(2)定点正小数(即原码小数)相除:在被除数的低位添加n个0
这样,就将所有情况都统一为:一个2n位数除以一个n位数




- 带符号数除法
- 原码除法
- 商符和商值分开处理
- 商的数值部分由无符号数除法求得
- 商符由被除数和除数的符号确定:同号为0,异号为1
- 余数的符号同被除数的符号
- 补码除法
- 方法1:同原码除法一样,先转换为正数(类似原码表示),先用无符号数除法,然后修正商和余数。
- 方法2:直接用补码除法,符号和数值一起进行运算,商符直接在运算中产生。