• float在内存中如何存储?


    float为浮点型,32位机器中占4字节共32bit,下标0~31.

    31 位:符号位,正数为0,负数为1。

    30 位:方向位。小数点左移位1,右移为0。

    23~29:共7位,指数位。=指数-1。

    0~22:共23位,尾数。

    转换方法:

    1 整数部分转成二进制。整数不停的除2,直到商位0。逆序取出每次的余数。

    2 小数部分转成二进制。小数部分不停的乘2,直到结果的小数部分位0.正序取出每次的商。

    3 第一步和第二步得到数据拼接。第一步得到的结果在小数点左边,第二步得到的在小数点右边。转为科学计数法。

    4 拼接。按照上面的bit说明填充。尾数不够,右边补0.

    举例:写出8.25 12.5 0.25 都是如何在内存中保存。

    8.25的存储计算方法:

    1. 整数部分8转成二进制:

        8/2=4 余 0

        4/2=2 余0

        2/2=1 余0

        1/2=0 余1 商位0 那么停止。 得到逆序 1000    

         2、小数部分0.25转位二进制:

        0.25*2=0.5 整数部分 0

        0.5*2=1.0  整数部分 1 次是小数部分为0 停止。得到正序 01

      3、用2进制:

        1000.01 = 1.00001 * 2的3次方。小数点左移了3位。

      4、

        31 :0

        30:  1

        指数位:3-1=2=0000010

        尾数:0000 1000 0000 0000 0000 000

      最终:0100 0001 0000 0100 0000 0000 0000 0000=0x41040000

      以上可以看出 如果是-8.25 只需要最高位变为1即可。最终:1100 0001 0000 0100 0000 0000 0000 0000 = 0xC1040000

      

    12.5的转换过程:

     1 整数部分:

        12/2 = 6 余 0

        6/2=3 余 0

        3/2=1 余1

        1/2=0 余1

                得到余数逆序 1100

      2 小数部分:

          0.5*2=1.0 整数为1

      得到 1

     3: 得到二进制:1100.1=1.1001*2的3次方

      4: 0 1 0000010 1001 0000000000000000000 = 0x41480000

    0.25转化过程

    1 整数部分转换为 0

    2 小数部分0.25 

        0.25*2=0.5 整数部分0

                0.5*2=1.0 整数部分1

    3 得到0.01 = 1.0*2的-2次方

    4 得到:0 0 1111101 0000000000000000000000=0x3E800000 指数部分 -2-1=-3=FD=11111101 拿走7位

  • 相关阅读:
    CF676E:The Last Fight Between Human and AI
    BZOJ2079: [Poi2010]Guilds
    BZOJ4518: [Sdoi2016]征途
    BZOJ2216: [Poi2011]Lightning Conductor
    51nod1766 树上的最远点对
    洛谷P1257 平面上的最接近点对
    BZOJ2144: 跳跳棋
    BZOJ4773: 负环
    BZOJ4552: [Tjoi2016&Heoi2016]排序
    The Falling Leaves(建树方法)
  • 原文地址:https://www.cnblogs.com/lan0725/p/11515584.html
Copyright © 2020-2023  润新知