java 原码 反码 和补码

来源:互联网 发布:中国工业数据库 编辑:程序博客网 时间:2024/06/08 15:03
 

JAVA基础学习总结---原码、补码、反码以及基本数据类型

分类: JAVASE 295人阅读 评论(0)收藏举报

--------- 原码、补码、反码

        计算机是数字电路设备,由复杂的电子元器件组合而成,一个电子元器件在工作时,可以分为两种状态--高电平和低电平,表示数据用高电平表示1,低电平表示0,而多个电子元器件组合在一起时就可以表示更多的状态,即更多的数据,如:000表示0,001表示1,010表示2等等,这也就是我们所说的2进制数据表示法。我们把一个电子元器件表示的数字称为1位(bit),计算机一般将8个电子元器件组合成一个单元,称为一个字节(byte),即这个单元可以表示2^8=256个数字,取值范围0~255.

 

         一个字节有8位,每一位都只可以表示两个数字0、1,我们把最左边的一位称为最高位,最右边的一位称为最低位。为便于描述,这里采用1个字节表示一个整数。

 

 原码:

          把最高位作为符号位,0表示正数,1表示负数。其余各位代表数值本身的绝对值,例如:

            1表示为0000 0001,-1表示为1000 0001

            7 表示 0000  0111   -7 原码表示为: 1000 0111

 

         但是计算机并没有采用原码的计数方式表示数据,为什么呢?  问题出在这:+0表示为0000 0000,-0表示为1000 0000.

 这样一来+0似乎不等于-0了。

 

反码:

         反码的表示分为两种情况:

如果一个数为正数,则反码和原码相同. 同时 补码也和他们相同.

如果一个数为负数,则符号位不变,其余各位按原码取反。

例如:   1的原码为0000 0001,反码为0000 0001.

-1的原码为1000 0001,反码为1111 1110.

同样的问题存在于反码:+0的反码为0000 0000    -0的反码为1111  1111。正因为如此,人们寻找出了一种真正能使计算机表示数据无歧义的数据表示方法:补码。

 

补码:

        模的概念:模是计量系统的计量取值范围。例如:时钟就可以看成是个计量器,它的取值范围是0~11,即模(mod)=12,

计算机也可以看成计量器。

       “模”的实质是计量器“溢出”的量,是计量器不能表示的数值。任何有模的计量器都能化减法为加法运算,例如:在以10为模的系统中,8和2相对于模来说互为“补数”,实际上1和9,3和7等都有这个共同点,他们加起来等于10(模),他们都互为补数,那么,6-2 =4,2和8互为“补数”,6+8 = 14,去掉一个“模”:10,即14-10 =4;

在计算机中 数字用补码表示, 主要是为了0 的交叉问题:

+0 的原码:0000 0000

+0 的反码 0000 0000

+0 的补码: 0000 0000

 

-0 的补码: 0000 0000 导致结果一样 .因此 用补码表示 计算中的数字.

 为什么要设立补码呢?

第一是为了能让计算机执行减法:
[a-b]补=a补+(-b)补

第二个原因是为了统一正0和负0
正零:00000000
负零:10000000
这两个数其实都是0,但他们的原码却有不同的表示。
但是他们的补码是一样的,都是00000000
特别注意,如果+1之后有进位的,要一直往前进位,包括符号位!(这和反码是不同的!)
[10000000]补
=[10000000]反+1
=11111111+1
=(1)00000000
=00000000(最高位溢出了,符号位变成了0)

 

 

同样,在计算机里面,n位计算机,设n=8,则他所能表示的数据取值范围是1111 1111,若再将该数值加1,等于1 0000 0000

有9位,由于计算机只有8位,所以最高位自然丢失,又变成0000 0000,所以,n位计算机的模就是2^n,这样,计算机就可以把减数用它相应的补数代替了。把补数用到计算机数的处理上,就叫补码。

 补码表示:

        如果一个数为正,那么补码、反码原码都相同,如果一个数为负,那么他的补码就是他的反码加1。

,-42就是通过将42的二进制代码的各个位取反,即对00101010 取反得到11010101 ,然后再加1,得到11010110 ,即-42 。

-42

1. 先得到它的绝对值转换成的二进制: 0010 1010 或者是得到-42 原码:1010 1010

2. 然后对这个值取反 1101 0101 或着是 原码取反码:  负数取反的步骤是;最高位不变,其他位取反 1101 0101

3 在这个再加1           1101 0110 (1+1 =10)

 其实第1 种做法是错误的, 因为 补码:反码+1 .  应该先求得 -42 的原码 : 然后求反: 然后+1 ,而不应该是绝对值取反 因为正数的原码 和反码,补码都相同.

对正数取反  得到的结果就不是反码了. 只是单纯的取反.

负数的原码怎么求: 先得到正数的二进数,然后把最高位变为1.

负数的反码怎么求: 在原码的基础上,最高位不变, 其他各位取反.

 

 

 

未完。。。。继续写

原创粉丝点击