第三章预习
高级语言和机器指令中的运算
C程序中涉及的运算
1.按位运算
符号:|,&,~, ^
运用:实现掩码操作,通过与给定的一个位模式进行按位与,可以提取所需要的位,然后进行操作。
2.逻辑运算
符号:||, &&, !
此运算为非数值计算,只有true和false两个逻辑值。非0数表示true。全0表示false。
3.移位运算
左移运算是将一个二进制位的操作数按指定移动的位数向左移动,移出位被丢弃,右边移出的空位一律补0。右移运算是将一个二进制位的操作数按指定移动的位数向右移动,移出位被丢弃,左边移出的空位一律补0,或者补符号位,这由不同的机器而定。在使用补码作为机器数的机器中,正数的符号位为0,负数的符号位为1。
4.位扩展和位截断运算
一个小规律, 2n-2(n-1) = 2^(n-1) 3n-3(n-1)=2*3^(n-1) 。
位扩展其实很好理解,正数和0往前加零就够了,负数则是往前加一,不过注意位扩展往往都是隐形的,不知不觉就扩展了,比如 short i = 6; int j = i; 注意 位扩展 数值是不变的
位截断,就是保留低k位二进制码, 比如把一个四位二进制码截断成三位,这不可避免的改变了原来的值,
对于无符号数,B2U([X',X'',X''',X''''......]) MOD 2^k 就可以了。
对于有符号数,U2T(B2U([x',x'',x''',x''''.....])mod 2^k)
注: B2U 二进制码解释为无符号数 U2T 无符号数编码解释为补码
MIPS指令中涉及的运算
3.2基本运算部件
3.2.1串行进位加法器
如果操作数长n位,加法就要分n次进行,每次产生一位和,并且串行逐位地送回寄存器。
3.2.2并行进位加法器
并行加法器由多个全加器组成,其位数与机器的字长相同,各位数据同时运算。
最长运算时间主要是由进位信号的传递时间决定的
每个全加器都有一个从低位送来的进位输入和一个传送给高位的进位输出
进位通常分为串行进位与并行进位
3.2.3带标志加法器
3.2.4算术逻辑部件
3.3定点数运算
3.3.1补码加减运算
补码的基本规则:
3.3.2原码的加减运算
计算机中原码的加减法计算规则为:
符号位不参与计算,数值位进行加减。
① 在加法中分两种情况:
- 第二操作数为正号,此时对第一操作数和第二操作数的数值位做加法。
- 第二操作数为负号,此时对第一操作数和第二操作数的数值位做减法。
② 在减法中分两种情况:
- 第二操作数为正号,对第一操作数和第二操作数的数值位做减法。
- 第二操作数为负号,对第一操作数和第二操作数的数值位做加法。
在对数值位做加减法规则如下:
做加法时,符号位不参与计算,数值位相加。如果最高数值位产生了进位,则结果溢出。如果最高数值位没有产生进位,则结果正确,计算结果的符号位取第一操作数的符号。
做减法时,符号位也不参与计算,第二操作数取补码,与第一操作数相加。此时又分两种情况,相加时如果最高数值位产生了进位,说明数值位计算结果正确,符号位取第一操作数的符号;如果相加时最高数值位没有产生进位,则需要对计算结果取绝对值,即对所得到的数值位求补(所有数值位求反后+1)作为计算结果,符号位取第一操作数的符号的反。
3.3.3移码的加减运算
运算公式:
- [A]移+[B]移 = [A+B]补 (mode 2n)
- [A]移-[B]移 = [A-B]补 (mode 2n)
推导过程:
[A]移+[B]移
= 2n-1+A+2n-1+B
= 2n+A+B
= [A+B]补
[A]移-[B]移
= [A]移+[-[B]移]补
= 2n-1+A+2n-[B]移
= 2n-1+A+2n-2n-1-B
= 2n+A-B = [A-B]补
- [A+B]移 = [A]移+[B]移-2n-1
- [A-B]移 = [A]移-[B]移+2n-1
推导过程:
[A+B]移
=A+B+2n-1
=A+2n-1+B+2n-1-2n-1
=[A]移+[B]移-2n-1
[A-B]移
=A-B+2n-1
=(A+2n-1)-(B+2n-1)+2n-1
=[A]移-[B]移+2n-1
= [A]移+[-[B]移]补+2n-1
=[A]移+[[B]移]变补+2n-1
移码的和差等于和差的补码
3.3.4原码乘法运算
1.原码一位乘法
在定点计算机中,两个原码表示的数相乘的运算规则是:乘积的符号位由两数的符号按异或运算得到。而乘积的数值部分则是两个正数相乘之积。设n位被乘数和乘数用定点小数表示(定点整数也相同适用)
被乘数 [x]原 = xf .x0 x1 x2 … xn**
乘数 [y]原 = yf .y0 y1 y2 … yn
则乘积 [ z ]原 = ( xf⊕yf ) . (0. x0 x1 x2 …xn)(0 . y1 y2 …yn)式中,xf为被乘数符号。yf为乘数符号。
乘积符号的运算法则是:同号相乘为正,异号相乘为负。因为被乘数和乘数和符号组合仅仅有四种情况(xf yf = 00,01,10,11),因此积的符号可按“异或”(按位加)运算得到。
2.二位乘法
原码两位乘是用两位来决定新的部分积的形成,自然形成4种状态。
1)乘数为00时,无加操作
2)乘数为01时,+x
3)乘数为10时,+2x(可由x左移一位得到)
4)乘数为11时,可先–x再+4x(x左移两位)
注:加4x需引入触发器c,c=1时,+4x;初始状态c=0
运算原则
乘数判断位 标志位 操作内容
00 0 部分积右移2位,c置0
01 0 部分积+x后右移2位,c置0
10 0 部分积+2x后右移2位,c置0
11 0 部分积-x后右移2位,c置1
00 1 部分积+x后右移2位,c置0
01 1 部分积+2x后右移2位,c置0
10 1 部分积-x后右移2位,c置1
11 1 部分积右移2位,c置1
注:
1)当进行-x运算时,采用+[-|x|]的补码实现,且右移操作按补码右移规则完成(高位补1)
2)如果判断位是11,c=1,且没有下一代时(乘数全部右移完毕),若乘数的位数为偶数位,在乘数前面+00,若乘数的位数为奇数位,则+0即可
3)若乘数位为奇数位,最后需右移一位
3.3.5补码乘法运算
1.补码一位乘法
补码一位乘法的基本方法
设[X]补=X0X1X2X3...X**n[Y]补=Y0Y1Y2Y3...Y**n可证明:[X∗Y]补=[X]补∗(0.Y1Y2Y3...Y**n)−Y0∗[X]补进一步展开合并后可得:[X∗Y]补=[X]补∗i=1∑n(Y**i+1−Y**i)2−i(符号位参加运算)由公式得出补码一位乘法的运算规则如下:(1)如果Y**n+1=Y**n,部分积加0,部分积算术右移一位;(2)如果Y**n+1Y**n=10,部分积加[X]补,部分积算术右移一位;(2)如果Y**n+1Y**n=01,部分积加[−X]补,部分积算术右移一位。重复进行n+1步,但最后一步不移位。包括一位符号位,所得乘积位2n+1位,其中n为数据位位数。
2.补码二位乘法
两位一乘,,把乘数分为两位一组,根据两位代码的组合决定加或减被乘数的倍数,形成的部分积每次右移两位。
3.3.6快速乘法器
3.3.7原码除法运算
1.恢复余数除法
具有n位尾数的合法除法,需要逻辑移位n次,上商n+1次
算法步骤:
- 符号位单独处理,分别取除数和被除数绝对值进行运算(和原码两位乘一样,参与运算的是绝对值的补码)
- 若余数(被除数)为正,表示够减,商上1,左移一位,减去[ y ] 补 [y]_补[y]补;若余数(被除数)为负,表示不够减,商上0,恢复余数(加上除数),左移一位,加上[ − y ] 补 [-y]_补[−y]补
- 重复上一步骤n次(需设置一个计数器)
- 若最后一步余数为负,需要恢复余数,否则不需要
不恢复余数法
与恢复余数法的区别:
若余数(被除数)为负,表示不够减,商上0,,左移一位, 加上[ y ] 补 [y]_补[y]补
3.3.8补码除法运算
1.补码恢复余数除法
2.补码不恢复余数除法
-
符号位参加运算,除数与被除数均用双符号补码表示、
-
被除数与除数同号,被除数减去除数,被除数与除数异号,被除数加上除数。
-
余数与除数同号,商上1,余数左移一位减去除数; 余数与除数异号,商上0,余数左移一位加上除数。(注意:余数左移加上或减去除数后就得到了新余数。)
-
采用校正法包括符号在内,重复n+1次3.
3.4浮点数运算
3.4.1浮点数加减运算
1.对阶
-
求阶差
-
如果把阶码大的向阶码小的看齐,就要把阶码大的数的尾数部分左移,阶码减小。这个操作有可能在移位过程中把尾数的高位部分移掉,这样就引发了数据的错误,所以,尾数左移在计算机运算中不可取。
-
如果把阶码小的向阶码大的看齐,在移位过程中如果发生数据丢失,也是最右边的数据位发生丢失,最右边的数据位丢失,只会影响数据的精度,不会影响数据的大小。
在计算机中,采用小阶向大阶看齐的方法,实现对阶。2.尾数加减
3.尾数规格化
提高浮点数的表示精度,把计算机的提供的能够表示数据的硬件资源尽可能有效的利用起来。
-
左规
尾数左移一位,阶码减1,直到数符和第一数位不同为止(机器数表示方式是补码)。 -
右规(尾数的绝对值太大时,右规)
尾数右移一位,阶码加1。
当尾数溢出( >1 )时,需要右规。
是否溢出,可以通过两位的符号位得出:
即尾数出现01.xx…xx或10.xx…xx(两位符号位不同)4.尾数的舍入处理
舍入,是指数据的长度超过了计算机当中存储数据的物理器件所保存的数据长度。低位部分就要进行处理,保证数据能够以比较精确的精度保存在计算机当中。
在对阶和右规过程中,可能出现尾数末位丢失,引起误差。为了尽可能减小误差,就需要考虑舍入。
舍入的方法:
-
截断法
将移出的数据一律舍去。该方法简单,很常用。但是影响精度。 -
0舍1入法
移掉的是1,则尾数末尾加1,移掉的是0,就不加。 -
(末位)恒置“1”法
将要保留的末位数据恒置1,无论右移掉的是1还是0,末位是1还是0。
-
5.溢出判断
3.4.2浮点数乘除运算
1.浮点数乘法运算
2.浮点数除法运算
在浮点乘除运算时,为便于浮点数判断溢出和尾数进行阵列乘除运算运算,假设浮点数的阶码采用双符号位补码表示,尾数采用单符号补码或原码表示。
浮点乘法、除法运算步骤如下:
①阶码相加减
按照定点整数的加减法运算方法对两个浮点数的阶码进行加减运算。
②尾数相乘或相除
按照定点小数的阵列乘除法运算方法对两个浮点数的尾数进行乘除运算。为了保证尾数相除时商的正确性,必须保证被除数尾数的绝对值一定小于除数尾数的绝对值。若被除数尾数的绝对值大于除数尾数的绝对值,需对被除数进行调整,即被除数的尾数每右移1位,阶码加1,直到被除数尾数的绝对值小于除数尾数的绝对值。
③结果规格化并进行舍入处理
浮点数乘除运算结果的规格化和舍入处理与浮点数加减运算结果的规格化和舍入处理方法相同。并且在浮点数乘除运算的结果中,由于乘积和商的绝对值一定小于1,因此在浮点乘除运算结果进行规格化处理时只存在向左规格化,不可能出现向右规格化。
④判断溢出
浮点数乘除运算结果的尾数不可能发生溢出,而浮点数运算结果的溢出则根据运算结果中浮点数的阶码来确定,溢出的判定和处理方法与浮点加减运算完全相同。