深入理解计算机中的原码、补码、反码

机器数:

一个数在计算机的存储形式是二进制数,我们称这些二进制数为机器数,机器数是有符号,在计算机中用机器数的最高位存放符号位,0表示正数,1表示负数。

机器数的真值:

因为带有符号位,所以机器数的形式值不等于其真值,以机器数1000 0110为例,其真正表示的值为-6,而形式值为134。将带符号的机器数的真正表示的值称为机器数的真值。
0表示+,1表示-

原码:

原码的表示与机器数真值表示的一样,即用第一位表示符号,其余位表示数值,例如的十进制的的正负1,用8位二进制的原码表示如下:
+1= 0000 0001
-1= 1000 0001

反码:

反码的表示方法为:
正数的反码是其原码本身。
负数的反码是在其原码的基础上,符号位不变,其余各位取反。
+1= 原:0000 0001 = 反:0000 0001
-1= 原:1000 0001 = 反:1111 1110

补码:

补码的表示方法为:
正数的补码是其原码本身。
负数的补码是在其原码的基础上,符号位不变,其余各位取反后加1(即在反码的基础上加1)。
+1= 原:0000 0001 = 反:0000 0001 = 补:0000 0001

-1= 原:1000 0001 = 反:1111 1110 = 补:1111 1111

计算机只存储补码

为何使用原码、反码、补码

1.使用原码运算

计算十进制表达式:1-1 = 0;
1 - 1 = 1 + (-1)
= 原:[ 0000 0001 ] + 原:[ 1000 0001 ]
= 原:[ 1000 0010 ] = -2
如果用原码表示,让符号位也参与计算,对于减法来说,结果是不正确的。这也是计算机内部在存储数据时不使用原码的原因,为了解决这一问题,出现了反码。

2.使用反码运算
计算十进制表达式:1-1 = 0

1 - 1 = 1 + (-1)
= 原:[ 0000 0001 ] + 原:[ 1000 0001 ]
= 反:[ 0000 0001 ] + 反:[ 1111 1110 ]
= 反:[ 1111 1111 ] = 原: [ 1000 0000 ] = -0
通过计算我们发现用反码计算减法,结果的真值部分是正确的。而唯一的问题出现在”0”这个特殊的数值上,虽然人们理解上**+0和-0是一样的,但是0带符号是没有任何意义的,而且会有[0000 0000]原和[1000 0000]原两个编码表示0。为了解决-0这一问题,出现了补码。**

3.使用补码运算
1 - 1 = 1 + (-1)
= 原:[ 0000 0001 ] + 原:[ 1000 0001 ]
= 补:[ 0000 0001 ] + 补:[ 1111 1111 ]
= 补: [ 0000 0000 ] = 原: [ 0000 0000 ] = 0
这样0用[0000 0000]表示,而以前出现问题的-0则不存在了,而且人们还发现可以用[1000 0000]表示-128,-128的推算过程如下:
(-1) + (-127) = -128
= 原:[1000 0001] + 原:[ 1111 1111 ]
= 补:[ 1111 1111 ] + 补:[ 1000 0001 ]
= 补:[ 1000 0000 ]

注意:因为实际上是使用以前的-0的补码来表示-128,所以-128并没有原码和反码表示,只要补码是[1000 0000],其十进制数值就为-128。