8.9 移位运算
8.9.1 移位运算的分类
8.9.2 算数移位
移位:通过改变各个数码位和小数点的相对位置,从而改变各数码位的位权。
8.9.3 原码的算数移位
原码 -- 符号位不变,数值位移位
右移:高位补0,低位舍弃。若舍弃位不是0,会丢失精度
左移:低位补0,高位舍弃。若舍弃位不为0,会严重误差
8.9.4 反码的算数移位
正数的反码与原码一致
负数的反码移位运算:
1. 右移:高位补1,低位舍弃
2. 左移:低位补1,高位舍弃
8.9.5 补码的算数移位
正数的补码与原码一致
负数的补码:
1.右移:高位补1,低位舍弃
2. 左移:低位补0,高位舍弃
8.9.6 算数移位的总结
位数有限,无法精确表示乘除法
8.9.7 算数移位的应用
像X7这样的数可以分解为 X(2^0+2^1+2^2)
8.9.8 逻辑移位
逻辑右移:高位补0,低位舍弃
逻辑左移:低位补0,高位舍弃
看作无符号位的算数移位
8.9.9 逻辑移位的应用
8.9.10 循环移位
不带进位位:用移出的位补上空缺
带进位位:移出的位放到进位位,原进位位补上空缺
8.10 加法运算和溢出判断
8.10.1 原码的加减法
加法器直接对原码加法运算,可能会出错。
8.10.2 补码的加减法
补码的加减法,最终都变成加法,由加法器实现运算,符号位也参与运算
8.10.3 溢出判断
如何判断上溢和下溢?
硬件判断溢出的第一种方法:
硬件判断溢出的第二种方法
第三种方法:采用双符号位
8.10.4 符号扩展
定点整数:
1. 正数 +0
2. 负数 原码+0,反码补码+1
定点小数:
1.正数 +0
2.负数 原码补码+0,反码+1
8.10.5 回顾
8.11 原码的乘法计算
手算乘法的过程
先加法再移位
逻辑右移,高位补0,低位舍弃
原码一位乘法(手算)
整数的乘法与小数的类似
8.12 补码的乘法运算
补码与原码乘法的比较:
1. 补码:n轮加法、移位、再多来一次加法
2. 补码:加法加的数不一样(根据MQ中最低位、辅助位判定)
3. 补码是算术右移
4. 符号位参与运算
所谓的辅助位,就是把MQ寄存器多扩展一位
手算 补码乘法
算术右移:符号位不动,数值位右移,正数右移补0,负数右移补1
8.13 原码的除法运算
8.13.1 运算器的基本组成
运算器:实现算术运算、逻辑运算
除法:
1. ACC:被除数、除数
2. MQ:商
3.X:除数
8.13.2 恢复余数法
上商0/1,得到余数,余数末尾补0
默认上商1,如果不对再改为上商0,并恢复余数
应该商0
手算:恢复余数法
8.13.3 加减交替法
若余数为负数,可直接商0,让余数左移1位再加上除数的绝对值。
若为正数商1,减去除数的绝对值
只是被除数小于除数,计算机通过第一次计算的商确定,如果为1直接结束运算,机器无法表示这个定点数。
8.14 补码除法
8.14.1 加减交替法
补码除法:
1. 符号位参与运算
2.采用双符号位
末尾恒置1
8.15 除法运算回顾
8.16 强制类型转换
C语言中定点整数是用“补码”存储的
8.17 大小端模式
大端:便于人类阅读
小段:便于机器处理
边界对齐的存储方式
现代计算机通常是按字节编址即每个字节对应1个地址
通常也支持按字、按半字、按字节寻址
假设存储字长为32位,2则1个字=32bit,半字=16bit。 每次访存只能读/写1个字
字地址逻辑左移两位得到字节地址
边界不对齐的存储方式:
空间换时间