一、加法运算
补码加减法公式:
加法:
整数: [ a] 补 + [ b] 补 = [ a + b] 补(mod 2 ^ ( n + 1 ) )
小数:[ a] 补 + [ b] 补 = [ a + b] 补 ( mod 2 )
减法:
整数:[ a - b] 补 = [ a + ( - b) ] 补 = [ a] 补 + [ - b] 补 ( mod 2 ^ ( n + 1 ) )
小数:[ a - b] 补 = [ a + ( - b) ] 补 = [ a] 补 + [ - b] 补 ( mod 2 )
补码加减法规则:
1 、参加运算的两个操作数都用补码来表示
2 、符号位作为数的一部分参加运算
3 、若做加法,则两书直接相加;若做减法,则将减数变补后再与被减数相加
4 、运算结果仍用补码表示
5 、符号位的进位为模值,应该去掉
1、上述加法公式为符号位仅有一位时的公式,当符号位有进位时 mod 2 ^ (n + 1)
或者 2 来丢掉产生的进位
2、[-b]补 等于 b 的补码除了最后一个1,其余连同符号位一同取反
补码的溢出判断:
1 、单符号位法:
若操作数的两个符号位分别为 x/ y, 得到结果的符号位为s, 则
溢出 = x & y & s非 | x非 & y非 & s
2 、进位判断法:
设最高数值位的进位信号为 x, 符号位的进位信号为 y, 则
溢出 = x非 & y | x & y非 = x 异或 y
3 、双符号位判断法:
设置两个符号位 x 和 y, 则
溢出 = x 异或 y
1、补码运算溢出的情况:
1)正数 + 正数 最后得到 负数
2)负数 + 负数 最后得到 正数
单符号位法只是将这两种情况翻译成了二进制的符号位的运算
2、对于进位判断法,其实也是 1 中两种情况的另外一种翻译
当符号位没有进位而最高数值位有进位的时候,只有一种情况,例如
0,1001 和 0,1001
当符号位有进位而最高数值为没有进位的时候,也只有一种情况,例如
1,1001 和 1,0001
3、当采用双符号位的时候,两个符号位相同代表没有溢出,当两个符号位不同的时
候,就代表发生了溢出,此时符号位的较高一位为数的符号,而较低一位为数产
生的进位。
二、移位运算
移位运算可以实现二进制数的扩大(左移)与缩小(右移),当其与加减法配合的时候,可以实现乘法与除法。
算术移位规则(符号位保持不变):
正数的源码、补码、反码移位:补0
负数:
源码:补0
反码:补1
补码:左移补0 ,右移补1
逻辑移位规则(无符号数的移位):
高位、低位需要补位的时候均补0
1、移码规则总结起来就是当要添加的位置表示真值的时候补0,表示真值的反的时候补1
算术移位中丢掉1 的各种情况:
| 数值表示 | 左移 | 右移
| 真值为正 | 出错 | 丢失精度
| 负数的源码| 出错 | 丢失精度
| 负数的补码| 无影响| 丢失精度
| 负数的反码| 无影响| 无影响
1、因为高位表示的权值较大,丢失时会对结果产生致命性的影响,而低位表示的
权值较小,所以丢失时产生的结果可能会有精度的影响,就如
100000001
如果左边的 1 丢掉,则结果会产生错误,而右边的 1 丢掉,结果会与正确结果
有较小的差异,但大体上看来还是正确的。
2、当对应的位数值为 1 表示真值时,丢掉会对数值产生影响,但是当对应的位数
表示真值的反的时候,丢掉1就相当于丢掉真值的 0 ,对结果无影响
3、移位会使得数值扩大或者减小,上述讨论的是移位后的结果与人脑计算结果的
差别,例如
100 右移一位变成 10,得到二进制的 2,而人脑计算时 4 / 2 = 2,得到
十进制的 2,二进制的 10 和 十进制的 2 相等,这是右移丢 0 无影响的
含义,其他以此类推。