Skip to content

原码:最高位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位补码映射关系

Preview

注意

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