原码:最高位0表示正数,1表示负数
反码:正数与原码相同,负数除符号位取反
补码:正数与原码相同,负数在反码上加1
为什么需要反码?
因为计算负数和正数相加,直接使用原码二进制相加,结果是错的
比如说:
1+(-2)
= 0000 0001 + 1000 0010
= 1000 0011
= -3
使用反码相加就是对的了
1+(-2)
= 0000 0001 + 1000 0010 (原码)
= 0000 0001 + 1111 1101 (反码)
= 1111 1110 (反码)
= 1000 0001 (原码)
= -1
运算问题解决了,但是还存在歧义问题
就是+0和-0
+0 = 0000 0000
-0 = 1000 0000
为什么需要补码
解决0的歧义,因为无论正负0,转换完之后,补码都是0000 0000
为什么-0补码是0000 0000
-0的原码是1000 0000(1是符号位,000 0000
是数值位)
-0的反码是1111 1111(符号位不变,数值位取反)
-0的补码是1111 1111 + 0000 0001 = 0000 0000(符号位不变,数值位取反+1)
多余的进位会被丢弃,所以补码是0000 0000
最终数字是以【补码】的形式存在计算机中的,并以补码的形式进行二进制计算
补码如何转换为原码
最高位0表示正数,1表示负数
如果是正数,补码就是原码
如果是负数,除符号位全部取反,之后加1
1 +(-2)
= 0000 0001 + 1000 0010 (原码)
= 0000 0001 + 1111 1101 (反码)
= 0000 0001 + 1111 1110 (补码)
= 1111 1111 (补码)
= 1000 0001 (原码)
= -1
4位补码映射关系

注意
注意上图中,最高位是符号位,0表示正数,1表示负数。
符号位也参与表示数据,并不是额外的一位用来表示符号(我之前就搞错了)