第3章 运算方法和运算部件
1.高级语言和机器指令中的运算
1.C语言中的运算
1.按位运算
应用:掩码(masking)运算:通过与给定的一个位模式进行按位与,可以提取所需的位,然后对这些位进行“置1、清0、1测试、0测试”,例如:0x0F(0000 1110) & 0x8C的运算结果是0x8C,抹掉了位模式规定的不能有值的位。
2.逻辑运算
与按位与那算是不一样的,其只有两个值,非0和全零
3.移位运算
用来简化编译,左移*2,右移/2,比乘除法强多了
不考虑符号位,总是高位移出,低位补零。对于无符号数如果高位是1,则发生溢出。因为计算机内部是补码表示,所以对于带符号整数都是用补码表示的,所以对于带符号整数的移位操作应采用补码算术移位方式。左移时,高位移出,低位补0,没意义为,如果溢出的高位不同于移位后的符号位,则左移前、后符号位不同,右移时,低位移出,高位补符号位。
4.位扩展和位截断运算
扩展:无符号补0,有符号补符号(因为补码要加上的数会更大,所以补的是符号位)
截断:去掉高位
但截断以后有可能会溢出,因为如果截断以后的位数不能表示这么大的数,就溢出了。比如:32768是2的15次方,用32位int型肯定能存下,但是如果截断成16位,高16位被截掉,就会超出16位可以表示的最大正数32767,所以就会溢出了。
2.基本运算部件
整体的思路就是用ALU来完成各种运算,其核心部件是加法器
1.串行加法器
首先补充与,或,异或的作用:
- 与:保留某一位、一位乘(和1乘不动,和0乘变成0)
- 或:清除某一位
- 异或:与0异或不动,与1异或取法,所以可以用作加法。加一取法,加零不变
由上述作用可以确定本位的数字是,加数,被加数,前面的进位三者相加(异或)的来,有新的进位任意两个相乘然后的新的和,原因是:至少有一两位1的时候进位才是1,换句话说,三个数中最多有1个0,任意两个相乘只要不会多余1个0,结果都是1。
所以两级进位是两级门的延迟
n位串行加法器从C0到Cn一共是2n级延迟,从一开始到最后一位和数是2(n-1)+3=2n+1级延迟
为了提高加法的速度,就必须避免进位之间的依赖关系
2.并行进位加法器
原来每个进位依赖于前面的数一步步算过来,太慢了,所以,通过推倒发现每一位的进位只跟两个函数有关,一个是进位传递函数 Pi=Xi+Yi(若X和Y中如果有一个是1,若有低位进位输入,则一定会被传递到高位,这个仅为可以看作是低位仅为越过本为直接向高位传递的) 一个是进位生成函数GiXi+Yi(当X和Y都是1的时候,无论有无低位进位输入,本位一定向高位产生进位输出)
因为每一位的进位只跟X和Y有关,所以就直接每一位直接按公式加起来(异或)得结果即可,但是,虽然这样很快能运算,但是输入端得个数随着输入的增加而大幅加大,所以一般采用并行进位加法器和行波进位加法器串联的方式进行,当然组内可以并行,组外也可以并行
3.带标志加法器
判断是否溢出的方法:
双符号位:00的时候表示正数,11表示负数,01表示正数溢出为负数,10表示负数溢出为正数,总结:高位符号位表示结果本来的符号。
单符号位:因为溢出的表象是符号位发生改变,所以,最高位和次高位都有进位或都没有进位的时候就没有溢出,否则就