• C语言中float double等类型在内存中的存储


    问题:十进制数4.5的单精度表示和双精度表示:

    备注:   最高位符号位   0表示整数  1表示负数

                阶码:  表示的是2的多少次幂这个幂指数

                尾数:将其表示成科学计数法之后的舍去科学计数法表示的最高位为1的码数

    大致步骤是酱紫滴:

    1. 把4.5写成二进制:整数部分4=100,小数0.5*2=1.所以4.5(10进制)=100.1(2进制);
    2. 写成指数形式:100.1=1.001*2^2;
    3. 对于单精度来说有4个字节32位,我们通常用第32位(最高位)表示符号;用接下来的八位表示指数;用剩下的23位表示尾数;
    4. 对于上面那个数来说,符号为正,符号位为0;指数为2,这里使用移位存储的方式,要把指数变成2+127=129,二进制是1000 0001(红色部分);尾数位为1.001,因为表示成指数后第一位都是1,就给省了,只记录.001即可;
    5. 综上 4.5的单精度表示为 0100 0000 1001 0000 0000 0000 0000 0000;
    6. 写成16进制:40 90 00 00;存储时反向存储即可得到结果。(小端存储模式)
    7. 对于双精度来说有8个字节64位,一般用最高位表示符号位;用接下来的11位表示指数;用剩下的52位表示尾数;
    8. 指数本来是2,在做移位存储时要加上2^10-1=1023,即2+1023=1025,指数位存储的是1025的二进制编码1000 0000 001(红色部分);
    9. 4.5的双精度表示为0100 0000 0001 0010 0000 0000 0000 ……
    10. 写成16进制:40 12 00 00 00 00 00 00;存储的时候也要反过来存。

    Ps: 移位存储可以参看链接,主要思想就是要避免+0和-0的同时出现,并且能增大表示范围。操作方法就是,如果我们想用n位来存储带符号的整数a,那么做移位存储的时候就要存储a+( 2^(n-1) - 1 ) 的相应的二进制码;如n=8, a=2时,我们要存2+(2^7-1)=129的二进制码.

    移位存储:http://3y.uu456.com/bp_3fcoo8iccx7z7sg756cv_1.html

    可以参考下面的博文:

    浮点数的二进制表示学习笔记(有很多相应的例题): http://blog.163.com/yql_bl/blog/static/847851692008112013117685/

    http://blog.csdn.net/zmq5411/article/details/6301250

  • 相关阅读:
    react项目中如何解决同时需要多个请求问题
    jq+ajax+bootstrap改写一个动态分页的表格
    Window7+vs2008+QT环境搭建
    mssql charindex
    解决NTLDR is missing,系统无法启动的方法
    基于三汇语音卡的呼叫中心开发(一)
    Wince 或Windows平台 C#调用Bitmap对象后资源应该如何释放
    Anki:插件开发
    java.lang.ClassNotFoundException: com.opensymphony.xwork2.util.ValueStack
    struts2中action之间的一种跳转
  • 原文地址:https://www.cnblogs.com/bingdaocaihong/p/6993028.html
Copyright © 2020-2023  润新知