6.3 定点运算
一、移位运算
1.移位运算的数学意义
左移:绝对值扩大;右移:绝对值缩小。(都是数据相对于小数点移位)在计算机中,移位与加减配合,能够实现乘除运算。
2.算术移位规则
(1)符号位不变
(2)数据位规则如表3.1所示。
表3.1 移位规则
码制 | 添加代码 | |
正数 | 原码、补码、反码 | 0 |
负数 | 原码 | 0 |
补码 | 左移右侧添0 | |
右移左侧添1 | ||
反码 | 1(代表原码里面是0) |
例:设机器数字长为 8 位(含1位符号位),写出 A = +26时,三种机器数左、右移一位和两位后的表示形式及对应的真值,并分析结果的正确性。
解:A=+26=+11010
则原码、补码、反码均为0,0011010
移位操作 | 机器数 | 对应的真值 |
[A]原=[A]补=[A]反 | ||
移位前 | 0,0011010 | +26 |
左移1位 | 0,0110100(数值最高位丢弃) | +52 |
左移2位 | 0,1101000 | +104 |
右移1位 | 0,0001101 | +13 |
右移2位 | 0,0000110 | +6 |
例:设机器数字长为 8 位(含1位符号位),写出 A = -26时,三种机器数左、右移一位和两位后的表示形式及对应的真值,并分析结果的正确性。
解:A=-26=-11010
则原码为1,0011010,反码为1,1100101,补码为1,1100110
原码结果如下:
移位操作 | 机器数 | 对应的真值 |
移位前 | 1,0011010 | -26 |
左移1位 | 1,0110100(数值最高位丢弃) | -52 |
左移2位 | 1,1101000 | -104 |
右移1位 | 1,0001101 | -13 |
右移2位 | 1,0000110 | -6 |
补码结果如下:
移位操作 | 机器数 | 对应的真值 |
移位前 | 1,1100110 | -26 |
左移1位 | 1,1001100(数值最高位丢弃) | -52 |
左移2位 | 1,0011000 | -104 |
右移1位 | 1,1110011 | -13 |
右移2位 | 1,1111001 | -7 |
反码:
移位操作 | 机器数 | 对应的真值 |
移位前 | 1,1100101 | -26 |
左移1位 | 1,1001011(数值最高位丢弃) | -52 |
左移2位 | 1,0010111 | -104 |
右移1位 | 1,1110010 | -13 |
右移2位 | 1,1111001 | -6 |
3.算术移位的硬件实现
图3.1 算法移位的硬件实现
在移位过程如果1被移掉会怎样:
左移:(a)出错(b)出错(c)正确(丢掉0出错)(d)正确
右移:(a)影响精度(b) 影响精度(c) 影响精度 (d)正确
4.算术移位与逻辑移位的区别
算术移位:有符号数的移位(符号位不动);逻辑移位,无符号数的移位(符号位也参加移动)
逻辑左移,低位添0,高位移丢;逻辑右移,高位添0,低位移丢。
二、加减法运算
1.补码加减法运算的公式
如图3.2所示。
图3.2 补码加减运算公式
2.溢出的判断
(1)一位符号位判溢出
参加操作的两个数(减法时即为被减数和“求补”以后的减数)符号相同,其结果的符号与原操作数的符号不同,即为溢出。
硬件实现:最高有效位的进位(异或)符号位的进位=1,溢出。
如:
简单说一下,假如原来两个数都是正数,那么符号位是0,如果他们相加,进到符号位了一个1,符号位变成了1,但是符号位不会向上进位,所以符号位进位为0。所以符合有溢出的第1种情况。其它可以如此解释。
(2)两位符号位判溢出
3.补码加减法的硬件配置
[x]补’+[y]补’=[x+y]补’
[x-y]补’=[x]补’+[-y]补’
结果的双符号位相同,未溢出:00,xxxxx/11,xxxxx
结果的双符号位不同,溢出:10,xxxxx/01,xxxxx
最高符号位代表其真正的符号!
3.补码加减法的硬件配置
图3.3 补码加减法的硬件配置
三、乘法运算
1.原码的乘法运算
一些认识:
(1)乘法运算可以用加和移位实现;
(2)由乘数的末位决定被乘数是否与元部分积相加,然后右移1位形成新的部分积,同时乘数左移1位(末位丢弃),空出高位存放部分积的低位;
(3)被乘数只与部分积的高位相加。
(1)原码一位乘运算规则
以小数为例
2.补码的乘法运算
(1)补码一位乘法运算
以小数为例:设备乘数[x]补=x0.x1x2…xn,乘数[y]补=y0.y1y2…yn
①被乘数任意,乘数为正
与原码乘相似,但加和移位按补码规则运算。乘积符号的自然形成
②被乘数任意,乘数为负
乘数[y]补去掉符号位,操作同①。最后加[-x]补,校正。
③Booth算法(被乘数、乘数符号任意)
如图3.4所示。
图3.4 Booth算法
④Booth算法递推公式
图3.5 Booth算法递推公式
整数乘法和小数乘法过程完全相同,可用逗号代替小数点。原码乘,符号位单独处理,补码乘,符号位自然形成。
原码乘去掉符号位运算,即为无符号数乘法。不同的乘法运算需有不同的硬件支持。
四、除法运算
1.笔算除法
心算上商,余数不动低位补“0”,然后减右移一位的除数,上商的位置不固定。
2.笔算除法与机器除法的比较
笔算除法 | 机器除法 |
商符单独处理,心算上商 | 符号位异或形成,|x|-|y|>0,上商1;否则上商0 |
余数不动,低位补0,减右移一位的除数。 | 余数左移一位,低位补零,减除数。 |
2倍字长加法器,上商位置不固定 | 1倍字长加法器,在寄存器最末尾上商。 |
3.原码除法
以小数为例
[x]原=x0.x1x2…xb
[y]原=y0.y1y2…yn
[x/y]原=x0⊕y0·x*/y*
式中,x*=0.x1x2…xn为x的绝对值;y*=0.y1y2…yn为y的绝对值。
商的符号位单独处理:x0⊕y0;数值部分为绝对值相除x*/y*。
约定:小数定点除法x*<y*,整数定点除法x*>y*。被除数不等于0,除数不能为0。
(1)恢复余数法
例6.24 x=-0.1011,y=-0.1101,求[x/y]原,假设机器字长为5位,其中符号位1位,数值位4位。
解:[x]原=1.1011,[y]原=1.1101,[y*]补=0.1101,[-y*]补=1.0011
①x0⊕y0=1⊕1=0
②如下表:
[table id=1 /]
所以x*/y*=0.1101
所以[x/y]原=0.1101
余数为正,上商1;余数为负,上商0,恢复余数。
上商5次(第一次是0),第一次上商判溢出,移4次。
(2)加减交替法
运算规则:
设余数为Ri,
上商“1”:2Ri-y*;上商“0”:2Ri+y*。仍然是余数为正,上商1;余数为负,上商0。
例6.25 x=-0.1011,y=-0.1101,求[x/y]原,假设机器字长为5位,其中符号位1位,数值位4位。
解:[x]原=1.1011,[y]原=1.1101,[x*]补=0.1011,[y*]补=0.1101,[-y*]补=1.0011。
图3.6 例6.25图解
特点:上商n+1次,第一次上商判溢出,移n次,加n+1次,用移位的次数判断除法是否结束。
(3)原码加减交替除法硬件配置
图3.7 硬件配置
6.4 浮点四则运算
一、浮点数的加减运算
我们令x=Sx·2jx,y= Sy·2jy
1.对阶
(1)求阶差。如图4.1所示。
图4.1 阶码对齐方案
(2)对阶原则
小阶向大阶看齐。
例如:x=0.1101*201,y=(-0.1010)*211,求x+y。
解:[x]补=00,01;00.1101
由于阶码不相等,所以先需要求阶差。[Δj]补=[jx]补-[jy]补=11,10。所以x要向y看齐。进行对阶:[x]补’=00,11;00.0011
然后进行尾数求和,[Sx]补’+[Sy]补=11.1001。
所以[x+y]补=00,11;11.1001。
3.规格化
(1)规格化数的定义
r=2,1/2<=|S|<1
(2)规格化数的判断
S>0 | 规格化形式 | S<0 | 规格化形式 |
真值 | 0.1XX…X | 真值 | -0.1XX…X |
原码 | 0.1XX…X | 原码 | 1.1XX…X |
补码 | 0.1XX…X | 补码 | 1.0XX…X |
反码 | 0.1XX…X | 反码 | 1.0XX…X |
原码:不论正数、负数,第一数位均为1;补码,符号位和第一数位不同。
特例:
- S=-1/2=-0.100…0,其原码为1.100…0,补码为1.100…0,所以[-1/2]补不上规格化的数。
- S=-1,[S]补=1.000…0,所以[-1]补是规格化的数。
(3)左规
尾数左移一位,阶码减1,直到数符和第一数位不同为止。
(4)右规
当尾数溢出(>1)时,需右规。即尾数出现01.XX…X或10.XX…X时。尾数右移1位,阶码加1。
两个整数相加就有可能造成01.XX…X这种方式的溢出。其实0是符号位,1是数值位。
例6.27 x=0.1101*210,y=0.1011*201。求x+y(除阶符、数符外,阶码取3位,尾数取6位)。
图4.2 例6.27解答
4.舍入
在对阶和右规过程中,可能出现尾数末位丢失,引起误差,需考虑舍入。
(1)0舍1入法;
(2)恒置“1”法。
例6.28 如图4.3所示。
图4.3 例28解答
5.溢出判断(整个浮点数的溢出)
设机器数为补码,尾数为规格化形式,并假设阶符取2位,阶码的数值部分取7位,数符取2位,尾数取n位,则该补码在数轴上的表示为
图4.4 溢出判断
所谓下溢,就是阶码比-128还小(阶码为10,XX…X),按机器零处理;所谓上溢,就是阶码比127还大(阶码为01,xx…x)。
6.5 算数逻辑单元
一、ALU电路
图5.1 ALU电路
ALU是一个组合逻辑电路,是没有记忆功能的。为了对输出结果进行保存,要在Ai和Bi还有输出端有寄存器。控制端控制运算方式。例如74181,M=0做算术运算,M=1做逻辑运算。
二、快速进位链
1.并行加法器
图5.2 并行加法器
对于每一个FA,有3个输入(2个输入为加数,1个为仅为信息C)、2个输出(一个是结果Sn,一个是进位信息C)。下面对这个并行加法器做一个分析:
Ci生成和Ai、Bi有关系。若Ai和Bi都为1,则一定会进位,Ai或Bi有一个为1,那么Ci-1的值就会被传送给Ci。所以,di=AiBi称为本地进位;ti=Ai+Bi称为传送条件。则Ci=di+tiCi-1。
2.串行进位链(通常情况下)
进位链就是传送进位的电路。串行进位链就是进位进行串行传送。以4位全加器为例,每一位的进位表达式为如图5.3中式子所示。设与非门的级延迟时间为ty。
图5.3 串行进位链
4位全加器产生进位的全部时间为8ty,n为全加器产生进位的全部时间为2nty。
3.并行进位链(先行进位,跳跃进位)
n位加法器的进位同时产生,以4位加法器为例如图5.4所示。
图5.4 并行进位链
(1)单重分组跳跃进位链
n位全加器分若干小组,小组中的进位同时产生,小组与小组之间采用串行进位。以n=16为例。如图5.5所示。
图5.5 单重分组跳跃进位链
(2)双重分组跳跃进位链
n位全加器分若干大足,大足中又包含若干小组。每个大租中小组的最高位进位同时产生。大组和大组之间采用串行进位。
图5.6 双重分组跳跃进位链