原码存在的问题
- ✅正数加正数OK
- ✅负数加负数只是符号出错而已,数值的绝对值是对的
- ❌原码最大的问题就在于一个数加上他的相反数不等于零!反码的设计思想可能就是为了解决这一点
0001 + 0010=0011 (1+2=3) 正数之间的加法 OK
0000 + 1000=1000 (+0+(-0)=-0) 问题不大
0001 + 1001=1010 (1+(-1)=-2) 正数与负数相加 NG
1010 + 1001=0011 (-2+(-1)=3) 负数与负数相加 NG
反码存在的问题
- ✅正数加正数OK
- ✅正数与负数相加为0
- ❌反码最大的问题就在于 负数加负数计算错误
# 正数 + 正数
0001+0010=0011 (1+2=3) 正数之间的加法 OK
# 正数 + 负数
0001+1110=1111 (1+(-1)= -0) OK
反 反
0101+1010=1111 (5+(-5)= -0) OK
反 反
0010+1001=1011 (2+(-6)= -4) OK
反 反
# 负数 + 负数
1110+1101=1011 (-1)+(-2)=(-4) NG
反 反 反
1110+1101=1011 (-1)+(-2)=(-3) OK 但是从原码维度来看,他其实是-3。巧合吗?
反 反 原
1110+1100=1010 (-1)+(-3)=(-5) NG
反 反 反
1110+1100=1010 (-1)+(-3)=(-2) NG 验证了上面确实是巧合
反 反 原
引入补码
- ✅正数加正数OK
- ✅正数与负数相加为0
- ✅负数与负数相加OK
# 正数 + 正数
0001+0010=0011 (1+2=3) OK
# 正数 + 负数
0001+1111=0000 (1+(-1)= 0) OK
补
0101+1011=0000 (5+(-5)= 0) OK
补
0010+1010=1100 (2+(-6)= -4) OK
补 补
# 负数 + 负数
1111+1110=1101 (-1)+(-2)=(-3) OK
补 补 补
1111+1101=1100 (-1)+(-3)=(-4) OK
补 补 补
参考
原码,反码,补码杂谈
https://blog.csdn.net/qq_43479628/article/details
https://qb.zuoyebang.com.html
https://blog.csdn.net/Matthew575/article/details/86618990
八位二进制数能表示数的范围以及原码、反码和补码含义