背景介绍
1・计算机在任何情况下都只能识别
二进制。
2・计算机在底层存储数据的时候,永远存储的都是"二进制的补码形式"
。原因是:补码形式效率最高
。
原码・反码・补码之间的关系
正数
正数的原码、补码、反码表示方法均相同。
正数:66
原码:00011110
反码:00011110
补码:00011110
参考:https://baike.baidu.com/item/%E5%8F%8D%E7%A0%81?fromModule=lemma_search-box
负数
原码:如果我们用8位二进制表示一个数,
+66
的原码为00011110
,-66
的原码就是10011110
。
反码:原码二进制的符号位1不变,其余取反。
补码:负数反码加1,加1时记得是逢2进1。注意:并不是把反码+1就定义为补码,只不过是补码正好就等于反码加1罢了!!
负数:-66
原码:10011110
反码:11100001
补码:11100010
参考:https://baike.baidu.com/item/%E5%8E%9F%E7%A0%81?fromModule=lemma_search-box
0
原码:00000000
反码:00000000
补码:00000000
https://baike.baidu.com/item/%E8%A1%A5%E7%A0%81/6854613
原码存在的问题
1・正数加正数OK
2・负数加负数只是符号出错而已,数值的绝对值是对的
3・原码最大的问题就在于一个数加上他的相反数不等于零!反码的设计思想可能就是为了解决这一点
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
反码存在的问题
1・正数与负数相加为0
2・反码最大的问题就在于 负数加负数计算错误
# 正数 + 正数
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 验证了上面确实是巧合
反 反 原
引入补码
# 正数 + 正数
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
八位二进制数能表示数的范围以及原码、反码和补码含义