原码,反码和补码
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]。