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^02^12^2)
8.9.8逻辑移位逻辑右移:高位补0,低位放弃
逻辑左移:低位增补0,高位销毁
视为无符号位算术移位
8.9.9逻辑移位的应用
8.9.10循环移位不带进位位:用拆下的位填补空缺
带进位位:移动的位放入进位位,原始进位位填补空缺
8.10加法和溢出判定8.10.1原码的加减运算
如果加法器直接将源代码相加,则可能会发生错误。
8.10.2补数的加减法
补数的加减运算最终成为加法器,通过加法器实现运算,编码位也参与运算
8.10.3溢出判定
你如何判断上溢和下溢?
硬件确定溢出的第一种方法:
确定硬件溢出的第二种方法
第三种方法:采用2符号位
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寄存器增加1位
手算 补码乘法
算术右移:符号位不动,数字位右移,正数右移补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结束运算,机器就不能表示这个定点数。
8.14补数除法8.14.1加减交替法
补码除法:
1 .符号位参与运算
2.2采用符号位
末尾恒置1
8.15除法评审
8.16强制类型转换
c语言的定点整数以“补数”保存
8.17大小端模式大端:方便人类阅读
小段:机器容易操作
如何保存边界对齐
现代计算机通常对应于字节地址,即每字节一个地址
通常也支持以字为单位、半字为单位、字节为单位的寻址
假设存储字长为32位,则2是一个字=32bit,半字=16bit。 每次访问只能读写一个字符
将字地址逻辑向左移动2位得到字节地址
边界不规则列的保存方法:
改变时间