补码的加减法运算
1 补码的加法
举个栗子
1.1 正数加正数
正数的补码、原码表示形式一致
x = +3, y = +4
[3]_原 = 0,0011
[3]_补 = 0,0011
[4]_原 = 0,0100
[4]_补 = 0,0100
-------------------
0,0011 + 0,0100 = 0,0111
//补码: 0,0111转换为 原码: 0,0111 = 7 结果正确
1.2 负数加正数
负数的补码转化为原码,符号位不变,数值位全部取反 + 1
x = -8, y = 7
[-8]_原 = 1,1000
[-8]_补 = 1,1000
[7]_原 = 0,0111
[7]_补 = 0,0111
-------------------
1,1000 + 0,0111 = 1,1111
//补码: 1,1111 转换为 原码: 1,0001 = -1 结果正确
2 补码的减法
举个栗子
2.1 正数减正数
减去一个补码可以认为加上它相反数的补码,例如
3 - 4 == 3 + (-4)
相反数的补码等于,原数补码的全部位数取反 + 1,例如
0,0011 -> 1,1101
0,0100 -> 1,1011 + 1 -> 1,1100
x = +3, y = +4
[3]_原 = 0,0011
[3]_补 = 0,0011
[4]_原 = 0,0100
[4]_补 = 0,0100
[-4]_补 = 1,1100
-------------------
3 - 4 = 3 + (-4)
0,0011 + 1,1100 = 1,1111
//补码: 1,1111转换为 原码: 1,0001 = -1 结果正确
2.2 负数减正数
-8 - 7 = -8 + (-7)
x = -8, y = 7
[-8]_原 = 1,1000
[-8]_补 = 1,1000
[7]_原 = 0,0111
[7]_补 = 0,0111
[-7]_补 = 1,1001
-------------------
1,1000 + 1,1001
= 1 1,0001
//算术溢出
//只取,补码: 1,0001 转换为 原码: 1,1111 = -15
为什么此时会发生溢出呢?
- 因为,在此处机器字长我们自认为1个bit(符号位不算在内),也就是如果超出了1bit那么就算溢出