原码,反码和补码

Table of Contents

编码方式

对于一个数,计算机要使用一定的编码方式进行存储。原码反码补码是计算机存储一个具体数字的编码方式。

存储方式

数值在计算机是以补码的方式存储的。

机器数

一个数在计算机中的二进制表示形式,比如补码就是机器数的形式。

格式

机器数分为两部分:符号位和数据部分。

符号位

正数为0,负数为1;

  • 例1: 在字长为8位的计算机中,十进制的”+2”,转换为二进制为”00000010”。
  • 例2: 在字长为8位的计算机中,十进制的”-2”,转换为二进制为”10000010”。

机器数的真值

带符号位的机器数对应的真正数值。

原码

原码就是符号位加上真值的绝对值,即用第一位表示符号,其余位表示值;

反码

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

补码

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

举例:

十进制数 原码 反码 补码
85 01010101 01010101 01010101
-85 11010101 10101010 10101011
9 00001001 00001001 00001001
-9 10001001 11110110 11110111

使用补码的原因

反码的来历

计算机底层只有加法器,不支持减法运算,在进行减法运算,会转换为加法运算。即:1-1=1+(-1)。为了解决这个问题,不得不让符号位参与运算,从而产生了反码。

补码的来历

在用反码进行计算时,出现了”0”这个特殊的数值,0带符号是没有任何意义的。即有”00000000”和”10000000”两个编码表示0。于是设计了补码,负数的补码就是反码+1,正数的补码就是正数本身,从而解决了0的符号以及两个编码到的问题:用”00000000”表示0,用”10000000”表示-128。

注意:-128实际上是使用-0的补码来表示的,所以-128并没有原码和反码。而使用补码之后,就修复了0的符号以及存在两个编码的问题,而且还能够多表示一个最低数。这就是为什么8位二进制,使用补码表示的范围为[-128, 127]。

更加详细的解释