定点数运算.docx
- 文档编号:9171462
- 上传时间:2023-02-03
- 格式:DOCX
- 页数:33
- 大小:208.13KB
定点数运算.docx
《定点数运算.docx》由会员分享,可在线阅读,更多相关《定点数运算.docx(33页珍藏版)》请在冰豆网上搜索。
定点数运算
第三节 定点数运算
定点数运算包括移位、加、减、乘、除几种。
一、移位运算
1.移位的意义
移位运算在日常生活中常见。
例如15米可写作1500厘米,单就数字而言,1500相当于小数点左移了两位,并在小数点前面添了两个0;同样15也相当于1500相对于小数点右移了两位,并删去了小数点后面的两个0。
可见,当某个十进制数相对于小数点左移n位时,相当于该数乘以10n;右移n位时,相当于该数除以10n。
计算机中小数点的位置是事先约定的,因此,二进制表示的机器数在相对于小数点作n位左移或右移时,其实质就便该数乘以或除以2n(n=1,2...n)。
移位运算又叫移位操作,对计算机来说,有很大的实用价值,例如,当计算机没有乘(除)运算线路时,可以采用移位和加法相结合,实现乘(除)运算。
计算机中机器数的字长往往是固定的,当机器数左移n位或右移n位时,必然会使其n位低位或n位高位出现空位。
那么,对空出的空位应该添补0还是1呢?
这与机器数采用有符号数还是无符号数有关,对有符号的移位叫算术移位。
2.算术移位规则
对于正数,由于[x]原=[x]补=[x]反=真值,故移位后出现的空位均以0添之。
对于负数,由于原码、补码和反码的表示形式不同,故当机器数移位时,对其空位的添补规则也不同。
下表列出了三种不同码制的机器数(整数或小数均可),分别对应正数或负数,移位后的添补规则。
必须注意的是:
不论是正数还是负数,移位后其符号位均不变,这是算术移位的重要特点。
不同码制机器数移位后的空位添补规则
码 制
添补代码
正数
原码、补码、反码
0
原码
0
负数
补码
左移添0
右移添1
反 码
1
由上表可得出如下结论:
(1)机器数为正时,不论左移或右移,添补代码均为0。
(2)由于负数的原码其数值部分与真值相同,故在移位时只要使符号位不变,其空位均添0。
(3)由于负数的反码其各位除符号位外与负数的原码正好相反,故移位后所添的代码应与原码相反,即全部添1。
(4)分析任意负数的补码可发现,当对其由低位向高位找到第一个“1”时,在此“1”左边的各位均与对应的反码相同,而在此“1”右边的各位(包括此“1”在内)均与对应的原码相同,即添0;右移时困空位出现在高位,则添补的代码应与反码相同,即添1。
例:
设机器数字长为8位(含一位符号位),若A=±26,写出三种机器数左、右移一位和两位后的表示形式及对应的真值,并分析结果的正确性。
解:
(1)A=+26=(+11010)2
则[A]原=[A]补=[A]反=0,0011010
移位结果表示如下:
移位操作
机 器 数
对应的真值
[A]原=[A]补=[A]反
移位前
0,0011010
+26
左移一位
0,0110100
+52
左移两位
0,1101000
+104
右移一位
0,0001101
+13
右移两位
0,0000110
+6
可见,对于正数,三种机器数移位后符号位不变,左移时最高数位丢1,结果出错;右移时最低数位丢1,影响精度。
(2)A=-26=(-11010)2
三种机器数移位结果示于下表。
移位操作
机 器 数
对应的真值
移位前
原
码
1,0011010
-26
左移一位
1,0110100
-52
左移两位
1,1101000
-104
右移一位
1,0001101
-13
右移两位
1,0000110
-6
移位前
补
码
1,1100110
-26
左移一位
1,1001100
-52
左移两位
1,0011000
-104
右移一位
1,1110011
-13
右移两位
1,1111001
-7
移位前
反
码
1,1100101
-26
左移一位
1,1001011
-52
左移两位
1,0010111
-104
右移一位
1,1110010
-13
右移两位
1,1111001
-6
可见,对于负数,三种机器数移位后符号位均不变。
负数的原码左移时,高位丢1,结果出错;低位丢1,影响精度。
负数的补码左移时,高位丢0,结果出错;低位丢1,影响精度。
负数的反码左移时,高位丢0,结果出错;低位丢0,影响精度。
下图示意了机器中实现算术左移和右移操作的硬件框图。
其中(a)真值为正的三种机器数的移位操作;(b)负数原码的移位操作;(c)负数补码的移位操作;(d)负数反码的移位操作。
3.算术移位和逻辑移位的区别
有符号数的移位称为算术移位,无符号数的移位称为逻辑移位。
逻辑移位的规则是:
逻辑左移时,高位移出,低位添0;逻辑右移时,低位移出,高位添0。
例如,寄存器内容为01010011,逻辑左移为1010010,算术左移为00100110(最高数位“1”移丢)。
又如寄存器内容为10110010,逻辑右移为01011001。
若将其视为补码,算术右移为11011001。
显然,两种移位的结果是不同的。
上例中为了避免算术左移时最高数位丢1,可采用带进位(Cy)的移位,其示意图如下图所示。
算术左移时,符号位移至Cy,最高数位就可避免移出。
二、加法与减法运算
加减法运算是计算机中最基本的运算,因减法运算可看作被减数加上一个减数的负值,即A-B=A+(-B),故在此将机器中的减法运算和加法运算合在一起讨论。
现代计算机中都采用补码作加减法运算。
1.补码加减运算的基本公式
无符号的原码与有符号的补码表示均为加权和表示法,因此满足直接的加法(乘法也类似);也就是符号位参与运算,事实上补码表示的最高位并不是严格意义上的符号位,这和原码表示中的符号位是不同的。
即补码表示的两个数在进行加法运算时,可以把符号位与数位同等处理,只要结果不超出机器能表示的数值范围,运算后的结果按2n+1取模(对于整数);或按2取模(对于小数),就能得到本次加法的运算结果。
无符号数和有符号数之间相加时,其结果规定为无符号数(实际上计算机也不关系这个)。
尽量少使用无符号数。
也就是说,补码的表示在结果求余的情况下是和原码相同的,或者说在结果求余的情况下,用哪种表示计算机是不关注的。
因此,若机器数采用补码,当求A-B时,只需先求[-B]补(称[-B]补为“求补”后的减数),就可按补码加法规则进行运算。
补码求非的方法有两种:
A.按位取反,结果加1
B.
因此
的非为
舍去最高位均相当于对
求余
也就是说,结果求余的情况下舍去超出位是不影响结果的。
结论:
计算机在计算时根本不区分有符号数与无符号数,仅仅按照如下简单的计算规则如下
(1)进位(加权和表示法)
(2)截断(模
加法)
补码加法的基本公式为:
整数 [A]补+[B]补=[A+B]补 (mod2n+1)
小数 [A]补+[B]补=[A+B]补 (mod2)
即补码表示肋两个数在进行加法运算时,可以把符号位与数位同等处理,只要结果不超出机器能表示的数值范围,运算后的结果按2n+1取模(对于整数);或按2取模(对于小数),就能得到本次加法的运算结果。
对于减法因A-B=A+(-B)
则[A-B]补=[A+(-B)]补
由补妈加法基本公式可得:
整数 [A-B]补=[A]补+[-B]补 (mod2n+1)
小数 [A-B]补=[A]补+[-B]补 (mod2)
因此,若机器数采用补码,当求A-B时,只需先求[-B]补(称[-B]补为“求补”后的减数),就可按补码加法规则进行运算。
而[-B]补由[B]补连同符号位在内,每位取反,末位加1而得。
例:
x=0.1010,y=-0.0011,用补码的加法求x+y
解:
[x]补=0.1010,[y]补=1.1101
[x]补+[y]补=0.1010+1.1101=0.0111(按模2的意义,最左边的1丢掉)
x+y=0.0111
例:
x=0.1001,y=-0.0011,用补码的减法求x-y
解:
[x]补=0.1001,[y]补=1.1101,[-y]补=0.0011
[x]补-[y]补=[x]补+[-y]补=0.1001+0.0011=0.1100
x-y=0.1100
例:
设机器数字长为8位,其中一位为符号位,令A=-93,B=+45,求[A-B]补。
解:
由A=-93=-1011101,得[A]补=1,0100011
由B=+45=+0101101,得[B]补=0,0101101,[-B]补=1,1010011
[A-B]补=[A]补+[-B]补=1,0100011+1,1010011=10,1110110
按模2n+1的意义,最左边的“1”自然丢掉,故[A-B]补=0,1110110,还原成真值得A-B=118,结果出错,这是因为A-B=-138超出了机器字长所能表示的范围。
在计算机中,这种超出机器字长的现象,叫溢出。
为此,在补码定点加减运算过程中,必须对结果是否溢出作出明确的判断。
解:
由A=-93=-1011101,得[A]补=1,0100011
2.溢出判断
补码定点加减运算判断溢出有三种方法。
(1)用一位符号位判断溢出。
对于加法,只有在正数加正数和负数加负数两种情况下才可能出现溢出,符号不同的两个数相加是不会出现溢出的。
对于减法,只有在正数减负数或负数减正数两种情况下才可能出现溢出,符号相同的两个数相减是不会出现溢出的。
因此在判断溢出时可以根据参加运算的两个数据和结果的符号位进行;两个符号位相同的补码相加,如果和的符号位与加数的符号相反,则表明运算结果溢出;两个符号位相反的补码相减,如果差的符号位与被减数的符号位相反,则表明运算结果溢出。
这种方法需要判断操作是加法还是减法,以及运算结果与操作数的符号关系。
符号不同的两个数相加不会产生溢出的原因是字长为n+1位时,数值部分为n位,数值部分的最大绝对值为2n。
如果参加运算的两个数x和y的绝对值都小于2n,则(+x)+(-y)和(-x)+(+y)的绝对值都不会大于2n,因此只需考虑(+x)+(+y)和(-x)+(-y)的情况,这时结果z的符号应与x和y的符号相同,即当x0=1且y0=1时,z0=0说明数据溢出;或者当x0=0且y0=0时,z0=1说明数据溢出。
这样可列出下表所示的判断逻辑的真值表。
x0 y0 z0
V
0 0 0
0
0 0 1
1
0 1 0
0
0 1 1
0
1 0 0
0
1 0 1
0
1 1 0
1
1 1 1
0
根据真值表,可得判断溢出的逻辑表达式:
这种溢出判断方法不仅需要判断加法运算的结果,而且需要保持原操作数。
(2)利用数据编码的最高位(符号位)和次高位(数值部分的最高位)的进位状况来判断运算结果是否发生了溢出。
两个补码数实现加减运算时,若最高数值位向符号位的进位值与符号位产生的进位输出值不相同,则表明加减运算产生了溢出。
因为当x和y均为n+1位正整数时,其和有两种情况:
当x+y<2n时,不会发生溢出;当x+y≥2n时符号位没有进位,表明发生溢出。
当x和y都是n+1位负数时,其和也有两种情况:
当x+y≥-2n时,不会发生溢出;当x+y<-2n时,符号位相加后变成0并且有进位,而数值部分的最高位相加时无进位,结果变为正数,表明发生了溢出。
减法的情况与此类似,这种判断方法的逻辑表达式如下:
例:
设x=+1011,y=+1001,求[x+y]补。
解:
[x]补=01011,[y]补=01001
[x+y]补=01011+01001=10100
两个正数相加,最高两位的进位为01,表示发生了溢出,其结果为负数,显然是错误的。
例:
设x=-1101,y=-1011,求[x+y]补。
解:
[x]补=10011,[y]补=10101
[x+y]补=10011+10101=01000
两个负数相加,最高两位的进位为10,表示发生了溢出,其结果为正数,显然是错误的。
(3)采用双符号位补码进行判断。
正常时两个符号位的值相同,在运算结果中当两个符号位不同时则表明发生了溢出。
运算结果的符号位为01表明两个正数相加,结果大于机器所能表示的最大正数,称为上溢;运算结果的符号位为10表明两个负数相加,结果小于机器所能表示的最小负数,称为下溢。
也就是说,两个正数相加,数值位不应向符号位同时产生进位,使得结果数的符号位和操作数的一样,为00:
00+00+00(进位)=00 (mod4)
两个负数相加,数值位应向符号位产生进位,使得两个负数的双符号位的运算为11;
11+11+01(进位)=11 (mod4)
当运算结果的两个符号位不相同时,表明出现了溢出。
判断溢出的逻辑表达式:
其中Z′为增加的符号位。
例:
设x=+1100,y=+1000,求6位双符号位补码之和[x+y]补。
解:
[x]补=001100,[y]补=001000
[x+y]补=001100+001000=010100
[x+y]补=010100,其中两个符号位出现01,表示已溢出。
例:
设x=-1100,y=-1000,求6位双符号位补码之和[x+y]补。
解:
[x]补=110100,[y]补=111000
[x+y]补=110100+111000=101100
[x+y]补=101100,其中两个符号位出现10,表示已溢出。
从上述例子中还看出,不论溢出与否,最高位始终指示正确的符号。
采用双符号位补码后,任何小于1的正数,两个符号位都是0;任何大于-1的负数,两个符号位都是1。
如果两个数相加后,其结果的符号位出现01或10时,表示发生溢出。
因为两个绝对值小于1的数相加,其结果不会大于或等于2,所以最高位总是表示正确的符号。
这也可以表示为:
当最高数据位有进位而符号位无进位时产生上溢出;当最高数据位无进位而符号位有进位时,表示下溢出。
在双符号位补码中,正常的数据中两个符号位总是相同的,所以在存储数据时不必重复存储,只是在将数据送往运算部件进行运算时才把符号位进行复制形成双符号位补码。
3.基本的二进制加法/减法器
设加法器的输入端为xi和yi,进位输入端为ci,结果输出端为zi,进位输出端为ci+1,则一位加法器的真值表如下表所示。
输入
输出
x0 y0 ci
ci+1 zi
0 0 0
0 0
0 0 1
0 1
1 0 0
0 1
1
0 1
1 0
0 1 0
0 1
0 1 1
1 0
1 1 0
1 0
1 1 1
1 1
第i位加减法电路的输入输出关系可表示为
同一套加法器电路,可以完成[x+y]补和[x-y]补的运算,实现过程中的差别仅表现在加法时y用其原值,而减法时对y求一次补。
求补的操作就是在按位求反的基础上最低位再加上1,结果得到[-y]补。
求补操作可以通过在输入端增加一个反相输入实现,加1操作可通过在最低位上设置进位输入信号为1来实现。
这样改进的加法器电路ALU如下图所示。
在上图所示的具有加减法功能的电路中增加了一个信号M,用于控制加减法运算。
当M=0时得到上述相同的全加器公式:
当M=1时得到求差公式:
三、乘法运算
在计算机中,乘法运算是一种很重要的运算,有的机器由硬件乘法器直接完成乘法运算,有的机器内没有乘法器,但可以按机器作乘法运算的方法,用软件编程实现、因此,学习乘法运算方法不仅有助于乘法器的设计,也有助于乘法编程。
下面从分析笔算乘法入手,介绍机器中用到的几种乘法运算方法。
(1)分析笔算乘法:
设A=0.1101,B=0.1011,求A×B。
笔算乘法时乘积的符号由两数符号心算而得:
正正得正;其数值部分的运算如下:
所以 A×B=+0.10001111
可见,这里包含着被乘数4的多次左移,以及四个位积的相加运算。
若计算机完全模仿笔算乘法步骤,将会有两大困难:
其一,将四个位积一次相加,机器难以实现;其二,乘积位数增长了一倍,这将造成器材的浪费和运算时间的增加。
为此,对笔算乘法做些改进。
(2)笔算乘法的改进:
将A•B=A•0.1011
=0.1A+0.001•A+0.0001•A
=0.1A+0.00•A+0.001(A+0.1A)
=0.1A+0.01[0•A+0.1(A+0.1A)]
=0.1{A+0.1[0•A+0.1(A+0.1A)]}
=2-1{A+2-1[0•A+2-1(A+2-1A)]}
=2-1{A+2-1[0•A+2-1(A+2-1(A+0))]}
由上式可见,两数相乘的过程,可视作加法和移位(乘2-1相当于做一位右移)两种运算,这对计算机来说是非常容易实现的。
从初始值为0开始,对上式作分步运算,则
第一步:
被乘数加零 A+0=0.1101+0.0000=0.1101
第二步:
右移一位,得新的部分积 2-1(A+0)=0.01101
第三步:
被乘数加部分积 A+2-1(A+0)=0.1101+0.01101=1.00111
第四步:
右移一位,得新的部分积 2-1A+2-1(A+0)=0.100111
第五步:
0•A+2-1[A+2-1(A+0)]=0.100111
第六步:
2-1{0•A+2-1[A+2-1(A+0)]}=0.0100111
第七步:
A+2-1{0•A+2-1[A+2-1(A+0)]}=1.0001111
第八步:
2-1{A+2-1[0•A+2-1(A+2-1(A+0))]}=0.10001111
上述运算过程可归纳为:
①乘法运算可用移位和加法来实现,当两个四位数相乘,总共需做四次加法和四次移位。
②由乘数的末位值确定被乘数是否与原部分积相加,然后右移一位,形成新的部分积;同时,乘数也右移一位,由次低位作新的末位,空出最高位放部分积的最低位。
③每次做加法时,被乘数仅仅与原部分积的高位相加,其低位被移至乘数所空出的高位位置。
计算机很容易实现这种运算规则。
用一个寄存器存放被乘数,一个寄存器存放乘积的高位,又用一个寄存器存放乘数及乘积的低位,再配上加法器及其他相应电路,就可组成乘法器。
又因加法只在部分积的高位进行,故不但节省了器材,而且还缩短了运算时间。
1.原码一位乘法
由于原码表示与真值极为相似,只差一个符号,而乘积的符号又可通过两数符号的逻辑异或求得,因此,上述讨论的结果可以直接用于原码一位乘,只需加上符号位处理即可。
上图是一个32位乘法器的结构框图,其中32位被乘数放在R2中,运算开始时32位乘数放在R1中,运算结束时64位乘积的高位放在R0中,低位放在R1中,R0和R1串联移位。
完成这个定点原码一位乘法的运算规则可以用如下图所示的逻辑流程图表示。
在该乘法过程中,每次操作是根据乘数的一位进行操作,对于32位数的乘法,需要循环32次完成一个乘法操作,因此称为一位乘法。
例:
用原码的乘法方法进行2×3的四位乘法。
解:
在乘法开始之前,R0和R1中的初始值为0000和0011,R2中的值为0010。
在乘法的第一个循环中,判断R1的最低位为1,所以进入步骤1a,将R0的值加上R2的值,结果0010送人R0,然后进入第二步,将R0和R1右移一位,R0、Rl的结果为00010001,见下表的循环1,表中黑体字的数据位是乘法过程中判断的R1最低位。
第二个循环过程中,判断R1的最低位为l,仍进入步骤la,加0010,结果为0011,然后在第二步中将R0和R1右移一位,结果为00011000,见下表的循环2。
第三次循环中,因R1的最低位为0,进入步骤lb,R0不变,第二步移位后结果为00001100,见下表的循环3。
第四次循环时仍因R1最低位为0,只作移位,结果为00000110,这就是乘法的结果6,见下表的循环4。
循环
步骤
乘积(R0,R1)
0
初始值
00000011
1
1a:
加0010
00100011
2:
右移1位
00010001
2
1a:
加0010
00110001
2:
右移1位
00011000
3
1b:
加0
00011000
2:
右移1位
00001100
4
1b:
加0
00001100
2:
右移1位
00000110
2.原码两位乘法
原码两位乘与原码一位乘一样,符号位的运算和数值部分是分开进行的,但原码两位乘是用两位乘数的状态来决定新的部分积如何形成,因此可提高运算速度。
两位乘数共有4种状态,对应这4种状态可得下表。
乘数yn-1yn
新的部分积
00
等于原部分积右移两位
01
等于原部分积加被乘数后右移两位
10
等于原部分积加2倍被乘数后右移两位
11
等于原部分积加3倍被乘数后右移两位
表中2倍被乘数可通过将被乘数左移一位实现,而3倍被乘数的获得可以分两步来完成,利用3=4-1,第一步先完成减1倍被乘数的操作,第二步完成加4倍被乘数的操作。
而加4倍被乘数的操作实际上是由比“11”高的两位乘数代替完成的,可以看作是在高两位乘数上加“1”。
这个“1”可暂时存在Cj触发器中。
机器完成置“1”Cj即意味着对高两位乘数加1,也即要求高两位乘数代替本两位乘数“11”来完成加4倍被乘数的操作。
由此可得原码两位乘的运算规则如下表所示。
乘数判断位yn-1yn
标志位Cj
操作内容
00
0
z→2,y*→2,Cj保持“0”
01
0
z+x*→2,y*→2,Cj保持“0”
10
0
z+2x*→2,y*→2,Cj保持“0”
11
0
z-x*→2,y*→2,置“1”Cj
00
1
z+x*→2,y*→2,置“0”Cj
01
1
z+2x*→2,y*→2,置“0”Cj
10
1
z-x*→2,y*→2,Cj保持“1”
11
1
z→2,y*→2,Cj保持“1”
表中z表示原有部分积,x*表示被乘数的绝对值,y*表示乘数的绝对值,→2表示右移两位,当作-x*运算时,一般采用加[-x*]补来实现。
这样,参与原码两位乘运算的操作数是绝对值的补码,因此运算中右移两位的操作也必须按补码右移规则完成。
尤其应注意的是,
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 定点 运算
![提示](https://static.bdocx.com/images/bang_tan.gif)