原码、反码和补码(举-128为例子)

来源:互联网 发布:vba聊天软件 编辑:程序博客网 时间:2024/06/13 00:23

 1.模的概念(具体的可以查数学中的 "同余模") 

       在日常生活中,有许多化减为加的例子。例如,时钟是逢12进位,12点也可看作0点。 当将时针从10点调整到5点时有以下两种方法

         1)将时针逆时针方向拨5,相当于做减法: 105

         2)将时针顺时针方向拨7,相当于做加法:10(12-5)1255    (模为 12)   

 2.模的运用(采用模得到补码

       1)补码的得来:是为了让负数变成能够加的正数,so,负数的补码=-负数的绝对值 

                    比如:-1 补码:1111 1111(10000 0000 -1得来

                    当一个数要减1的时候,可以直接加 1111 1111        

2)原码的得来:(负数的原码,直接把对应正数的最高位改为1) 

          原码能够直观的表示一个负数(能直观的把真值显示出来,如 -11000 0001   其中最高位表示符号位,不进行算术计算)       

 3)总结:补码相加,到第9位才舍弃(模10000 0000                

    原码相加,到第8位舍弃(模1000 0000                

    反码相加,到第8位舍弃(模1000 0000        

3.原码和补码之间转换: 

        1)补码=原码减1,再取反(便于理解) 补码反码+1(便于描述和推理)              

2)演示:补码=原码减1,再取反 

               -1的原码1000 0001-->1000 0000(1)-->1111 1111(取反后)补码             

 3)演示:补码反码+1) 

               -1的原码  1000 0001-->1111 1110(反码)-->1111 1111(1)补码             

4)重点:(特别是在有进位的时候

           原码和反码的最高位是符号位,不参加算术运算,模为1000 0000(比补码少一个0) 

           而补码所有位都可以相加,模为10000 0000(最高位不是符号位,补码是通过模 减去 负数绝对值得到的

4.推断-128的原码和补码(用补码反码+1 

        1)关于原码1000 0000,表示的是-0,还是-128呢?(答案是-128而不是-0             

1、先看看原码的概念吧:正数的符号位为0,负数的符号位为1,其它位按照一般的方法来表示数的绝对值 

             2、0是负数吗?0既不是正数也不是负数,那么它的符号位到底是0还是1呢?(0的符号位为0,不能为1 

             3、看看负数补码的公式:负数的补码=10000 0000(模)-数的绝对值                        

比如:

-1 1111 1111 =10000 0000-0000 0001                              

-2 1111 1110 =10000 0000-0000 0010                

现在假设-0为负数,那么-0的补码应该是10000 0000 - 0(这个0,姑且教0的绝对值吧)=0000 0000                 

反码:1111 11110000 0000 -1=0000 0000 +1111 1111=1111 1111                 

原码:1000 0000  

              4、 现在来推-128 

                -128的补码:10000 0000 - 1000 0000+128没有符号位)=1000 0000                       

反码:1111 11111000 0000 -1=1000 0000+1111 1111=1111 1111(补码-1) 

                 原码:1000 0000(反码取反)             

从上面看来,一个原码对应了2个补码 

             但是仔细分析:原码的概念,负数的符号位为1,但是0不是负数,所以不能用此公式 

                          0也不是正数,但是可以把0定义为原码、反码和补码都一样(即0000 0000 

                          而且据说可以推断出0的补码只有一个(有兴趣的 可以去推一下,呵呵) 

             现在原码1000 0000就唯一表示-128了,而不会表示出-0,因为-0不能用这个公式计算 

             现在,补码1000 0000的原码是1000 0000(已证明),那么原码1000 0000的补码是1000 0000吗? 

               原码 1000 0000  (-128,进位被舍去)                反码 1111 1111  

               补码 1000 0000(1111 1111(反码) + 1=1000 0000,这里实际上真正相加的是1111 1111后面的7

                        1位是符号位始终不会变,所以,当进到第8位的时候,就表示溢出了,会被舍弃

      2)综上所述:

1、-128的补码和原码一样都是1000 0000 

        2、0的原码、反码和补码都一样(即0000 0000                       

3、如果把-0当做负数,1000 0000就会有歧义(事实上0的补码只有一个0000 0000   

0 0