zoukankan      html  css  js  c++  java
  • 整数与浮点数的二进制表示方式 分类: C/C++ 2015-06-13 15:45 54人阅读 评论(0) 收藏

    一、整数的表示

    1、对于无符号数,可以认为是不包含负数的原码表示方法,即直接把正数转换成二进制表示;

          对于有符号数,有三种表示方法

          1)补码,最高位的权重为-2^(w-1),这是原码表示的最高位权重是正好相反的。补码是有符号数用的最多的编码方式,表示的有符号数据的范围为[-2^(w-1),2^(w-1)-1]。

          2)反码,最高位的权是-(2^(w-1)-1);

          3)原码,最高位为符号位;

          可见,对于有符号数的表示方法,原码和反码是对称的表示方法,而补码是非对称的。

    2、在编程中,使用较多的是有符号数,无符号数用的较少,在很多语言中都没有无符号数,C系语言中是有无符号数的。使用无符号数是一件很危险的事,当一个有符号数和一个无符号数运算时,有符号数会被转化成无符号数的形式。所以应尽可能不要使用无符号数。

    3、有符号数和无符号数的转化:

            有符号数和无符号数的转化仅仅只是位表达方式的转变,而位的值是不改变的。因为有符号数和无符号数的位表达方式是不一样的,所以转化后的值不一定相同。

            这里有一个比较有用的转化公式,从有符号数x向无符号数转化时,若x>0,则结果为其自身;若x<0,则结果为x+2^w。因为补码表示的有符号数,最高位的权是-2^(w-1),而无符号数,最高位的权是2^(w-1),所以应加上2*2^(w-1)。当求一个负数的补码时,等价于求x+2^w的原码,这个公式是非常重要的。

    4、一个数据大小到另一个数据大小的转化

           1)短数据到长数据的转化

           对于无符号数采用零扩展的方式,即在扩展位补零;

           对于有符号数采用符号位扩展方式,即在扩展位添加符号位的副本;

           可以看出,无论哪种转化,短数据到长数据的转化是不影响值的大小的,所以从短数据到长数据的转化是安全的。

            2)长数据到短数据的转化

           无论是有符号数还是无符号数,从长数据到短数据的转化都是一样的方式,即截断。保留低位数据,超出短数据长度的数据统一丢弃。所以,这是一种不安全的转化方式。

    5、整数的加法运算

          两个整数的加法可能超出该整数的表示范围,即溢出,但也仅仅可能产生一位数据的溢出。如果整数的位数是w,x+y的结果是(x+y)%2^w,即直接丢弃溢出位。

          无论是有符号数还是无符号数,处理方式都是一样。对于无符号数,只可能产生正溢出,溢出后结果为x+y-2^w。假设s=x+y,判断溢出的条件为s<x(s<y);

          对于有符号数,正溢出结果和无符号数处理方式一样,负溢出结果为x+y+2^w。负溢出判断条件x+y>=0,正溢出判断条件为x+y<0;前者带等号,是因为有符号数的下限为-2^(w-1),当两个数都为-2^(w-1)时,相加结果为0;而有符号数的上限为2^(w-1)-1,溢出结果不可能等于0。

          无论是有符号数还是无符号数,二进制的加法都是一样的。

    6、补码的非

          补码的非运算出现的情况不多,求位级补码非的方式之一是对每一位求补,再对结果加1。其实结果就是-x(有一种特例,当x=-2^(w-1)时,补码的非运算结果为其本身)。

    7、整数的乘法

         对整数的乘法溢出处理其实和对加法的溢出处理结果是一样的,对于超出表示范围的结果统一丢弃。对于整数的乘法运算,可以考虑以位运算的方式代替,位运算的效率比乘除法要高很多。

    8、除以2的幂

         对于无符号数直接逻辑右移,结果向零舍入,结果可靠。对于有符号数,如果是正数,则和无符号数一样的处理方式;

         如果是负数,则应采用算术右移且右移之间应进行偏置。

         考虑x/2^k,若x<0,如果直接算法右移,结果不是向零舍入而是向下舍入,如-7/2=-4,但真实结果应该是-3,所以在移位前应先将x加上2^k-1,即偏置。

    二、浮点数的表示

    1、浮点数表示方法:(-1)^s  x  M  x 2^E

            符号:s决定了这个数是负数(s=1)还是正数(s=0);

            尾数:M是一个二进制的小数;

            阶码:E的作用是对浮点数加权,E可以取负值。

    2、对于float类型,s是1位,M是23位,E是8位;

          对于double类型,s是1位,M是52位,E是11位;


  • 相关阅读:
    python 对比学习
    支付宝
    springboot logback
    ngnix学习视频
    node学习
    puppeteer 相关知识
    Dota2App--第三天
    Dota2APP--第二天
    Dota2APP--第一天
    iOS ---进阶之摇一摇
  • 原文地址:https://www.cnblogs.com/zclzqbx/p/4687120.html
Copyright © 2011-2022 走看看