在了解了数据的二进制表示以后,我们可以把任意整数转换为它的二进制码表示
但是在计算机中,我们存储整数没有那么简单,所以我们在本文中介绍三种编码,为我们理解整数在计算机中存储提供帮助。
1.原码:
原码为我们表示负数提供了一种方式,如果我们只用二进制码来编码的话,我们是无法表示一个负数的,而原码规定了如果一个数是负数,那么它的最高位为1,如果是正数,则它的最高位编码是0。
这里的最高位是由计算机分配给这个数据的空间决定的(在计算机中,每种数据类型的存储都有一段基本固定的空间,每个空间被分配了不同数量的位),我们这里以8位存储为例(8个二进制位)解释一下原码的意义。
这就是原码的表示,非常容易理解,只是在二进制码前加了一个符号位而已。
2.反码:
反码的概念更加简洁,就是把一段1,0表示的编码按位取反。
比如11111的反码就是00000,101的反码就是010
3.补码:
补码是另一种既可以表示正数,也可以表示负数的编码方式,方便了计算机存储整数和对整数进行计算,所以在计算机中的应用比较广泛。
我们都知道一个二进制整数可以表示为:
这样的话,如果最高位是1,那么不论后面的位数情况如何,这个数都一定是负数,而这个位如果是0,那么这个数一定是个正数。
所以我们以这样的定义也可以得到一种可以表示正负的编码方式。
例如 10011在补码里代表的就是1*-16+1*2+1*1=-13
4.补码和原码的区别:
补码和原码都可以表示正数和负数,那么这两者有什么区别吗?
我们在一个八位的存储空间内,如果这时一个数的编码为:
01111111
此时如果它是原码表示,那么它的十进制数值就是 127
如果它是补码表示,同样的,十进制数值也是127
因为此时最高位(符号位)为0,表示为正数,补码和原码没有什么区别。
如果我们此时让它加1,数字就会变成:
10000000
此时在原码里,它的十进制数值就是0
但是我们发现,在补码里,它的十进制数值就是-128
如果我们从0开始,依次加1,则原码在到达正数的最大值以后,会变为0,然后变为-1,-2,等等
但是补码在达到正数的最大值以后,会变为负数的最小值,-128,然后再递增为-127,-126等等。
这就是原码和补码在表示数值时的区别,把一段二进制编码解释为原码或补码往往会得到两个完全不同的数值。
5.原码转补码:
在计算机中,因为补码在计算中的一些特性,我们往往倾向于用补码在计算机中存储数据,但是我们发现,补码并没有原码直观,在看到一个负数的时候,我们很难快速反应出这个数的补码。但我们能很快的反应出这个数的原码。
所以我们常常需要一种方法将原码转换为补码,即加取反加一法:
这个方法分为两步,我们拿10010这个原码来举例说明:
(1):除符号位外取反码(符号位不变): 将10010除了最高位(符号位)不变,其他位都取反码:1 1101
(2):将最低位加1(符号位不变):
我们再将11101的最低为加1(保证符号位不变)后变为:11110
这时我们就得到了原码10010的补码11110,按照定义验算后发现:
原码10010=-2
补码11110=-16+8+4+2=-2
原码和补码所表示的数是相等的
这就是原码转补码的一般方法。