zoukankan      html  css  js  c++  java
  • 32位十六进制浮点数转十进制

    之所以会遇到这个问题,是因为在一次做项目中,调试所用的小板是通过串口输出十六进制的浮点数。例如 “66 66 A6 40”表示的就是5.2f。需要实现十六进制浮点数到十进制的转换,首先需要了解浮点数在内存中的存储形式。在内存中浮点数由 “符号位 + 指数部分 + 尾数部分”三部分组成。

    以“66 66 A6 40”为例,计算其浮点值.

    一、首先将其按照高字节在前,低字节在后的原则排列好。

    40         A6        66         66

    二、将其按位展开。

    0100 0000   1010 0110  0110 0110   0110 0110

    三、其中第一位为符号位,为0则为正数,为1则为负数。第二部分则为指数部分100 0000 1,第三部分则为尾数部分010 0110 0110 0110 0110 0110。

    0  100 0000 1  010 0110 0110 0110 0110 0110

    四、计算的指数部分为129,将其与127相减,等于2,得到幂为2。

    五、计算尾数部分是需要在前面加上“1 .”(具体原因不是很记得了,也是在网上查资料时看到的),得到      1 . 010 0110 0110 0110 0110 0110

    六、因为幂为2且为正数,因此将小数点往右移2位。(为负数往左移)

                                          1 01.0 0110 0110 0110 0110 0110

    七、此时结果已经很明显了,每一位都与其位权值相乘,即可得到所需值。

    正数部分:1*2^2 + 1*2^0

    小数部分:1*2^(-3) +1*2(-4) + ......

    得到浮点数值为5.2f

    --------------------------------------------------------------------------------------------------------------------

    如果要使用程序来实现计算,则比较简单了,利用共用体的特性进行计算。

    union temp{

            float x;

            char table[4];

    };

    int main()

    {       char ch[] ={0x66,0x66,0xA6,0x40};

            union temp tp ;

            float num;

            tp.table[0] = ch[0];

            tp.table[1] = ch[1];

            tp.table[2] = ch[2];

            tp.table[3] = ch[3];

            num = tp.x;

            printf("%f\r\n",num);

    }

    X 即为所需计算的浮点数值。

  • 相关阅读:
    Android开发环境下关于如何导出手机通讯录数据库【Written By KillerLegend】
    Win+R快速打开你的应用程序
    public void onItemClick(AdapterView arg0, View view, int position,long arg3)详解【整理自网络】
    Adapter的getView方法详解
    LayoutInflater中四种类型inflate方法的介绍
    程序员电脑桌面,哪一张触动了你?
    o​r​a​c​l​e​ ​O​D​B​C​配​置 图形界面
    C#String与string大小写的区别
    怎么使用FlashFXP上传网站
    C#操作Excel文件
  • 原文地址:https://www.cnblogs.com/jiayezi/p/14556246.html
Copyright © 2011-2022 走看看