1 移位运算
1.1 移位运算——逻辑运算
(1)注意,对象是:无符号数。
- 应用举例:
1.2 移位运算——算术运算
(1)注意,对象是:有符号数
- 正数:
总结:
- 负数:
- 总结:
可以看到,虽然补码左移补数规则同原码,但是丢失规则则是同反码;而补码右移补数规则同反码,但是丢失规则则是同原码。
- 习题:
(2)补码的另外一种算术移位方法:
(3)
(4)算术移位的应用:
可以看出,机器内部的乘法运算可以转换成加法和算术移位操作,所以不用设计专门的乘法器,从而降低硬件成本。
(5)C语言中的移位运算:
有符号数右移进行算术右移,无符号数右移进行逻辑右移。
不管有没有符号,左移则是逻辑左移。
注意,这里的算术右移也是会移动符号位的。
- 练习:
1.3 移位运算——循环运算
(1)不带CF标志位的移位过程中,CF就是存储每次移出的位,新的会覆盖老的,CF虽然存储,但是并没有起到辅助移位的作用,所以在这里说的是不带CF。
- 不带CF标志位的循环右移:
- 不带CF标志位的循环左移:
- 带CF标志位的循环右移:
- 带CF标志位的循环左移:
(2)应用:
(3)C语言实现:
2 定点数的加减法
2.1 补码的加减法
(1)
-[B]补 = [-B]补。注意,这里的-[B]补并不是说直接改变[B]补的符号位!!!这里的-[B]补要算的话还是要换成[B]原码,求真值,然后取反。或者是计算[-B]的补码。补码就是为了在计算机中将减法变为加法。而对于知道[B]补的情况下,要求[-B]补,只需要全部位按位取反,末位加1即可。(因为[-B]补+[B]补=0,对[B]补取反的值+[B]补得到的是全部位为1的值,那么末位再+1,就可以得到结果0,因为高位溢出了,所以只要对[B]补全部位取反,末位+1就可以得到[-B]补)。
- 例题:
2.2 补码的加减法运算的溢出检测
(1)溢出:
(2)溢出检测方法:
- 法1: