引言
计算机中只能做加法
运算,它的减法
是通过加法来实现的。原码,反码,补码的产生过程,就是为了解决计算机做减法和引入符号位的问题
真值
正数或负数的
真值
→ 为其绝对值
对应的二进制数
前面加上正号或负号
例如:
+1
☞+0000001
;
-1
☞-0000001
;
原码
正数的原码 → 为其绝对值对应的二进制数,如
+1
的原码为00000001
;
负数的原码 → 为其绝对值对应的二进制数的第一位变为1
,如-1
的原码为10000001
;
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
原码最大的问题就在于一个数加上他的相反数不等于零!
反码的设计思想就是为了解决这一点
反码
正数的
反码
就是自己
负数的反码
就是他的原码除符号位外
按位取反
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
- 负数加负数只是符号出错而已,数值的绝对值是对的
通过反码可以得到 →
- 正数与负数相加用反码是可以运算的
补码
《计算机组成原理中》
负数的补码等于他的原码自低位向高位,尾数的第一个‘1’
及其右边的‘0’
保持不变,左边的各位按位取反,符号位不变。
常见算法:
正数
的原码
,反码
,补码
完全相同
负数
的补码
等于其反码+1
并不是把反码+1就定义为补码,只不过是补码正好就等于反码加1罢了!!
在补码中也不存在
负零
了,因为1000
表示-8
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