原码、反码、补码的理解

1)讨论原码之前首先需要了解两个概念:机器数和真值。

a.一个数值在计算机中的二进制表示形式,就称为这个数值的机器数。机器数是带符号的,其中最高位是符号位,1表示负数,0表示正数。比如,

1100 0000就是-64的机器数,即在计算机中的二进制表示形式。同样的,0100 0000就是64的机器数。

b.真值:因为第一位是符号位,所以机器数的形式值并不是真正的数值。机器数中除符号位之外的二进制串表示的才是真值(当然要加上符号才是真正的值)。

2)对于一个数,在计算机中如何表示呢?这就涉及到对其的编码问题,原码、反码、补码就是计算机中对数的三种编码方式。

a.原码就类似于上述机器数的定义方式,一个数的原码就是符号位加上真值的绝对值,即第一位表示符号位,其余位表示值。

-64的原码就是:1100 0000

+64的原码就是:0100 0000

计算机中只有加法器没有减法器,减法运算是转化为加法来进行的。以下举例说明使用原码进行加减法的过程:

64+64=0100 0000 + 0100 0000=0 1000 0000=128

64-64=64+(-64)=0100 0000+ 1100 0000=1 0000 0000=-0

1-1=1+(-1)=0000 0001 + 1000 0001=1000 0010=-2  计算错误

原码的表示方式存在的问题:

1.存在+0、-0的情况(0000 1000)

2.进行减法运算的时候,有些情况会计算出错(1-1=-2)

b.为了解决减法运算会出错的情况,引入了反码的编码形式。对于正数,其反码与原码完全相同(原码表示下,加法是正确的,所以正数的反码保持与原码相同即可),而负数的反码是保持原码的符号位不变,所有位依次取反,就得到反码。以下分别给出+1,-1的反码形式,并使用反码进行减法运算:

+1=[0000 0001]

-1=[1111 1110]

1-1=1+(-1)=0000 0001+1111 1110=1111 1111,结果是反码形式,需要将其转化为原码形式才能得到确切值,原码是1000 0000=-0。

但是反码对于0的表示方法任然是有两种,这里以4 bit为例:

0000 +0

1111 -0

c.采用了反码的形式之后,减法运算的结果是正确了的。不过对于0还是存在+0、-0的情况。为了解决这个问题,补码出现了。正数的补码就是其原码自身,负数的补码是在其反码的基础上+1。还是以+1、-1的补码形式说明:

+1=0000 0001

-1=1111 1111

1-1=1+(-1)=1 0000 0000 丢掉最高位=0000 0000=0(正数的补码和原码相同,所以是0)。

使用补码不仅解决了+0、-0的情况,而且还可以多表示一个最低数。下图以4 bit为例,说明了原码、反码、补码的”进化过程“:

(参考:https://www.zhihu.com/question/20159860

以下讨论原码和补码两种编码形式下,表示的取值范围。从上图易知,分别使用原码和补码,4 bits的取值范围是:

原码:[-7,7](包含+0、-0)

补码:[-8,7](只有一个0)

两种编码方式都表示了16个数值,只是原码有+0、-0之分,而补码只有一个0(+0),没有-0,因此可多表示一个最小值-8。-8的补码推倒过程如下:

-1-7=1111+1001=1000=-8,所以-8的补码是1000,其没有对应的反码和原码。

而8 bits的范围是:

补码:[-128,127] 1000 0000=-128

因此对于n bits分别以原码、补表示的数值取值范围是:

原码:[-(2^(n-1)-1),2^(n-1)-1]   有1个符号位,所以是n-1

补码:[-(2^(n-1)),2^(n-1)-1]

3)计算机中是以补码的形式表示数值的(起码是整数),编程语言也是以补码的形式表示数值的。

根据负数的原码求补码有一个比较简单的计算方法:符号位保持不变。从最低位开始,直至遇到第一个1之前,之前的所有位保持不变。遇到第一个1之后,保留这个1,以后按位取反直到符号位后一位。

根据负数的补码求其原码的方法:符号位保持不变,其余各位取反,然后再整个数加1。

另外,两个二进制数相减,等于加上减数保持符号位不变,取反 +1,即使加上其补码。

4)计算机只有加法器,将减法转化成加法,是利用了数学中的同余概念。

参考:http://www.cnblogs.com/zhangziqiu/archive/2011/03/30/ComputerCode.html

         https://www.zhihu.com/question/20159860

         http://www.cnblogs.com/wxf0701/archive/2008/08/14/1267639.html

     http://blog.csdn.net/liushuijinger/article/details/7429197

 

posted @ 2016-02-24 15:34  lz3018  阅读(1946)  评论(0编辑  收藏  举报