概述
在计算机中,原码、反码以及补码是为了区分正数与负数的表达与运算设计出来的,其中负数的二进制表示是先把数字获得二进制原码经反码再补码得到的
一、原码
在原码中即把数字直接转换为二进制,其中第一位为符号位
(符号位0代表整数,符号位1代表负数),其余为该数的二进制原码;例如下面是+12与-12的原码的表达方式:
+12:
0000 1100
-12:
1000 1100
在原码中正数与负数的二进制码除了符号位有区别外,其他是一样的;这里使用的是8位的二进制,使用多少位的二进制只是限制的数的取值范围,并没有多大的影响
上面8位的二进制因为有一位的符号位,因此它的取值范围为2^7 即:[-127,0] 和[0,127]
二、反码
反码,即对一个负数除符号位外的每一位的二进制原码进行取反(因为正数的反码还是其本身);我们把上面拿到的+12与-12的二进制原码进行反码得到:
+12:
0000 1100 (正数的反码还是其本身)
-12:
1111 0011
三、补码
补码,负数的补码在反码的基础上加1
;正数的补码还是其本身,如:
+12:
0000 1100 (正数的反码还是其本身)
-12:
1111 0100
四、二进制的运算
例如在计算12 + (-12)
在我们看来是很简单的,因为计算机在运算时不像人脑一样知道怎样计算的,它即使转为原码后相加后得到的结果很明显不是我们想要的:
(+12)0000 1100 + (-12)1000 1100 = 1001 1000
我们把-12反码补码后的二进制码为:
-12:
1000 1100 -->原码
1111 0011 -->反码
1111 0100 -->补码
此时我们再把12+(-12)
运行,式子变成了如下:
(+12)0000 1100 + (-12)1111 0100 = 0000 0000 -->结果
因为这里用的是8位的的二进制位,然后相加后超出的部分就被丢弃了然后变成了0000 0000;并且也不会存在-0这个数