zoukankan      html  css  js  c++  java
  • 二进制(原码、反码、补码)

    前言:

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

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

    二进制

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

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

    无符号数和有符号数

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

         (1)有符号数:

              对于有符号数而言,符号的正、负机器是无法识别的,但由于“正、负”恰好是两种截然不同的状态,如果用“0”表示“正”,用“1”表示“符”,这样符号也被数字化了,

              并且规定将它放在有效数字的前面,即组成了有符号数。所以,在二进制中使用最高位(第一位)来表示符号,最高位是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中”位运算符“与”移位运算“!     

  • 相关阅读:
    CF 461B Appleman and Tree
    POJ 1821 Fence
    NOIP 2012 开车旅行
    CF 494B Obsessive String
    BZOJ2337 XOR和路径
    CF 24D Broken robot
    POJ 1952 BUY LOW, BUY LOWER
    SPOJ NAPTIME Naptime
    POJ 3585
    CF 453B Little Pony and Harmony Chest
  • 原文地址:https://www.cnblogs.com/shamo89/p/9846385.html
Copyright © 2011-2022 走看看