1. 计算机知识
  2. 计算机基础
  3. 原码、补码、反码

在计算机中,数值数据常有三种不同的码值概念,分别为:原码、反码、补码,三者各有作用。

原码:计算机中的信息都是以二进制形式表示的,数值有正负之分,计算机就用一个数的最高位存放符号(0为正,1为负)。这就是机器数的原码了。设机器能处理的位数为8。即字长为1byte(8位),原码能表示数值的范围为(-127~-0 + 0~127)共256个。(出题时一般默认字长为8位)

原码就是符号位加上真值的绝对值, 即用第一位表示符号,其余位表示值。比如如果是8位二进制:

[+1]原 = 0000 0001

[-1]原 = 1000 0001

第一位是符号位。因为第一位是符号位,所以8位二进制数的取值范围就是:

[1111 1111 , 0111 1111]即[-127 , 127]

原码是人脑最容易理解和计算的表示方式。

反码:在两个整数的加法运算中使用原码是没有问题的,但是发现问题出现在带符号位的负数上,对除符号位外的其余各位逐位取反就产生了反码。反码的取值空间和原码相同且一一对应。 

反码的表示方法是:正数的反码是其本身;负数的反码是在其原码的基础上,符号位不变,其余各个位取反。

[+1] = [00000001]原 = [00000001]反

[-1] = [10000001]原 = [11111110]反

可见如果一个反码表示的是负数,人脑无法直观的看出来它的数值。通常要将一个数转换成原码再计算他的反码。

补码:又有新的问题出现在+0和-0上,在人们的计算概念中零是没有正负之分的。于是就引入了补码概念。 负数的补码就是对反码加1,而正数不变,正数的原码反码补码是一样的。在补码中用(-128)代替了(-0),所以补码的表示范围为:(-128~0~127)共256个。

原码、反码、补码都是有符号定点数的表示方法(日常生活中通常都使用有符号数,定点数对应的就是浮点数,即小数),反码、补码是为了简化二进制数的减法运算;

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

[+1] = [00000001]原 = [00000001]反 = [00000001]补

[-1] = [10000001]原 = [11111110]反 = [11111111]补

对于负数,补码表示方式也是人脑无法直观看出其数值的。通常也需要转换成原码在计算其数值。

三码功能与目的: 

反码:解决负数加法运算问题,将减法运算转换为加法运算,从而简化运算规则;

补码:解决负数加法运算正负零问题,弥补了反码的不足。

总之,反码与补码都是为了解决负数运算问题,跟正数没关系,因此,不管是正整数还是正小数,原码,反码,补码都全部相同。 

总结:

1、正数的原码、补码、反码均为其本身;

2、负数(二进制)的原码、补码、反码公式:

反码=原码(除符号位外)每位取反;

补码=反码+1;

反码=补码 -1;

举例:

在字长为8位的计算机中,-13的绝对值为13,13的二进制为1101。因为字长是八位所以将其补全八位即0000 1101。

则-13的原码为1000 1101(负数的原码将其符号位改为1);

反码为1111 0010(最高位1不变其他的逐位取反);

补码为1111 0011(反码加1就是补码)。