二进制(原码、反码、补码)

前言:

   bit(位):数据存储的最小单元。在计算机二进制系统中,位,简记为b,也称为比特(bit),每一个二进制数字0或1就是一个位(bit),其中每 8bit = 1 byte(字节);学习

   Java 中的int数据类型占4个byte(字节),而1 byte(字节) = 8 bit(位);(说白了,在二进制系统中是以bit 做为数据存储单元的)code

 

二进制

    二进制在计算机技术中普遍应用。二进制数用0和1两个数字及其组合来表示任何数,二进制的进位规则是:“逢2进1”。数字1在不一样的位上表明不一样的值,按从右至左orm

    的次序,这个值以2倍递增。htm

 

无符号数和有符号数

     在计算器中参与运算的数有两大类:无符号数和有符号数get

     (1)有符号数:it

          对于有符号数而言,符号的正、负机器是没法识别的,但因为“正、负”刚好是两种大相径庭的状态,若是用“0”表示“正”,用“1”表示“符”,这样符号也被数字化了,class

          而且规定将它放在有效数字的前面,即组成了有符号数。因此,在二进制中使用最高位(第一位)来表示符号,最高位是0,表示正数;最高位是1,表示负数。变量

     (2)无符号数:数据类型

          无符号数是针对二进制来说的,无符号数的表数范围是非负数。所有二进制均表明数值(全部位都用于表示数的大小),没有符号位。即第一个"0"或"1"不表示二进制

          正负。

 

    例子:

    (1)在Java中int数据类型是怎么在计算机中表示的呢?

         在二进制系统中是以bit(位)来做为数据存储单元的(详细内容请看前言),假设 int  number = 1 ,那么number在计算机系统中将表示以下:

         00000000  00000000  00000000  00000001

         同理可得,number=-1 时,在二进制中表示以下:

         10000000  00000000  00000000  00000001

         注意:最高位(第一位)是符号位,由于是number值为1是一个正数,因此最高位为0;

 

    (2)二进制转十进制?

         要从右到左用二进制的每一个数去乘以2的相应次方(次方要从0开始算起);

         假如:二进制数1101转化成十进制 ,那么 1101 = 1*20+0*21+1*22+1*23 = 1+0+4+8 = 13;

         注意:任何数的0次方都是1。

 

二进制中的原码、反码、补码

      对于有符号数而言:

      (1)二进制的最高位是符号位:0表示正数,1表示负数

      (2)正数的原码、反码、补码都同样;

      (3)负数的反码 =  它的原码符号位不变,其余位取反(0 ->1 ; 1->0 );

      (4)负数的补码 = 它的反码 +1;

      (5)0的反码、补码都是0;

      (6)在计算机运算的时候,都是以补码的方式来运算的;

      

      例子:

      下面咱们就使用“有符号数”来模拟一下,在计算机中是怎样运算的。

      (1)正数相加:

           例如:1+1 ,在计算机中运算以下:

           1的原码为:

           00000000  00000000  00000000  00000001

           由于“正数的原码、反码、补码都同样”,因此,1的补码 = 1的原码,因此 1的补码+ 1的补码 就等于:

           00000000  00000000  00000000  00000001

           +

           00000000  00000000  00000000  00000001

           =

           00000000  00000000  00000000  00000010

           00000000  00000000  00000000  00000010( 转换为10进制) = 0*2^0 + 1*2^1 = 0 + 2 =2 

      (2)正数相减:

           例如:1-2,在计算机中运算以下:

           在计算机中减运算实际上是做为加运算来操做的,因此,1-2 = 1 + ( -2 )

           第一步:把 1补码找出来(由于正数的原码、反码、补码都同样,因此咱们可经过原码直接获取补码):

             1的补码:

             00000000   00000000   00000000   00000001

           第二步:把-2的原码找出来:

             -2的原码:

             10000000   00000000   00000000   00000010

           第三步:把-2的反码找出来:

             -2的反码:

             11111111     11111111     11111111     11111101

           第三步:把-2的补码找出来:

             -2的补码:

             11111111     11111111     11111111     11111110

           第四步:1的补码与-2的补码相加:

              00000000   00000000   00000000   00000001

              +

              11111111     11111111     11111111      11111110

              =

              11111111     11111111     11111111      11111111

           第五步:将计算结果的补码转换为原码,反其道而行之便可(若是想将二进制转换为十进制,必须获得二进制的原码)

              补码:11111111     11111111     11111111      11111111

              =

              反码:11111111     11111111     11111111      11111110

              =

              原码:10000000  00000000   00000000    00000001

          第六步:将计算结果的二进制原码 转换 为十进制

              二进制原码:10000000  00000000   00000000    00000001  =  1*2^0 =  -1

 

JAVA中全部的数字变量都是有符号(正负)的?

       这句话,还有点争议。在Java中char类型是:16位Unicode字符,取值范围 0 ~ 65535 , 不存在负数范围,从这点上说:"char类型就是一个

       无符号数";

 

注意点:

     (1)正数的原码、反码、补码都同样;

     (2) 若是想将 二进制 转为 十进制,必须使用 二进制的原码;

 

学习了关于”二进制“的知识后,下面 ,咱们将学习Java中”位运算符“与”移位运算“!     

相关文章
相关标签/搜索