tips:原码补码正负数的关系;原码补码表示范围;移位运算可能出现错误和精度降低;溢出,上溢,下溢;
第一次写博客,希望能和大家交流一下。如果觉得宝宝写得还可以,求爸爸点个赞!刚起步的小学渣需要支持??
如有错误,希望能评论一下,我会修改,共同进步!冲鸭!(用颜色表示求赞的决心!)
计算机中的运算方法
无符号数和有符号数
- 真值(正负号)和机器数(0和1,即原码),都是二进制数。
- 原码(2^n + x)、补码[2^(n+1) + x]、反码[2^(n+1)-1 + x] ——都是X为负数的时候变化。
- 移码 (2^n + x) ——无论正负都要变化,不涉及小数,通常做阶码。1表示+,0表示-。
相反数的关系:
- 原码:符号位取反
- 反码:包括符号位全部取反
- 补码:包括符号位全部取反后加一
- 补码和移码无论正负数(包括0)符号位相反,数值位相同。
0的表示:移码和补码正负数的表示相同。原码和反码都有+-0之分。
表示范围(8位):
- 无符号数:【0,2^8-1】
- 原码:【-(2^7-1),+(2^7-1)】
- 反码:【-(2^7-1),+(2^7-1)】
- 补码:【-128,+(2^7-1)】-128的补码规定为1000 0000
数的定点表示和浮点表示
定点表示:没有特定的硬件表示小数点,用约定的方式表示。位于符号位后一位或者最小位后一位。
浮点表示:N=S×r^j;S,j都为小数,且可正可负。
定点运算
溢出的判断
单符号位:符号位的进位和最高位的进位做异或,1表示有溢出
双符号位(补码用):00为+,11为 - ;01表示上溢(两个正数溢出),10表示下溢(两个负数溢出)。只有同符号数相加,才可能溢出。
移位运算
左移扩大2倍,右移缩小2倍
左移丢1(负数补码丢0),出现运算错误;右移丢1,精度降低。
原码 | 左移 | 右移 |
0,1101(13) | 0,1010(10)❌ | 0,0110(6)精度降低 |
0,0110(6) | 0,1100(12)✔ | 0,0011(3)✔ |
补码 | 左移 | 右移 |
1,0011(-13) | 1,0110(-10)❌ | 1,1001(7)✔ 补码丢0,没有精度丢失, 0舍1入为7 |
- 逻辑移位:无符号数的移位。左移右移都补0。
- 算术移位:原码:都补0;补码:左移补0,右移补符号位;正数补0,负数补1
原码乘法
- 符号位单独运算做异或,数值部分绝对值进行乘法运算
- n次加,n次移位
- 逻辑右移:最低位最先运算,右移把最低位算出的结果移到总结果的最低位,所以右移。绝对值进行乘法运算,而且可能发生溢出,所以逻辑移位。
- ps:实际结果为0.1011,0110由于位数有限,所以结果为0.1011。而且右移过程可能会出现精度降低问题。
补码乘法——Booth算法
与原码乘法相同的区别:(假设x×y)
- 符号位参与运算,最后的符号位自动生成。
- 补码右移(算术右移)
- 乘数后添加一位0。判断a = Yn+1-Yn,若a<0,部分积+【-x】补;若a>0,加【x】补;若a=0,加0。
浮点数的规格化
原码:无论正负,第一位为1
补码:符号位和第一位不同
(基数不同规格化有区别,通常考原码,基数为2,第一位不为0;基数为4,前两位不为0;……)
特例:[-1/2]补 = 1.10000不是规格化数。[-1]补=1.00000是规格化数。
左归:尾数左移一位,阶码减1,直到符号位和第一位不同。左归可能归多次。
右归:当尾数溢出时(出现01,10),需要右归,尾数右移一位,阶码加1。右归只归一次。
浮点数的加减运算
- 对阶;(小阶向大阶看齐。防止出现溢出)求阶差。
- 尾数求和。
- 规格化。
- 舍入(0舍1入;恒置1)多计算两位,判断舍入。
例1 两浮点数x = 2101×0.11011011,y = 2111×(-0.10101100)。假设尾数在计算机中以补码表示,可存储10位尾数,2位符号位,阶码以补码表示,双符号位,求x+y。
解:将x,y转换成浮点数据格式
[x]浮 = 00 101, 00.11011011
[y]浮 = 00 111, 11.01010011+1
00 111, 11.01010100
步骤1:对阶,阶差为Ex-Ey
-Ey=11000+1=11001
Ex-Ey=00101+11001=11110=-2 < 0
Ex-Ey<0 Ex<Ey 小阶对大阶,
X阶码加2 X尾数右移2位
[x]浮 = 00 111, 00.00110110(11)
步骤2:尾数求和
[X+Y]浮 = 00 111, 00.00110110(11)
+ 00 111, 11.01010100
= 00 111, 11.10001010(11) ——多写两位,用于舍入
步骤3:计算结果规格化
[X+Y]浮 为非规格化数,左归一位, 阶码减一,
00110, 11.00010101(1)
步骤4:舍入处理
[X+Y]浮 = 00 110, 11.00010110 (0舍1如法)
[X+Y]浮 = 00 110, 11.00010101 (截去法)
逻辑实现(最后再补)
目录
目录