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 即为所需计算的浮点数值。

  • 相关阅读:
    LeetCode 141. Linked List Cycle(判断链表是否有环)
    LeetCode 680. Valid Palindrome II(双指针)
    >/dev/null 2>&1
    18个最佳代码编辑器
    vi和vim常用命令
    搞定Windows连Linux三大件:SecureCRT,FileZilla,NX
    define和typedef的区别
    C++ const,static成员
    C++虚函数练习题
    c++虚函数解析
  • 原文地址:https://www.cnblogs.com/jiayezi/p/14556246.html
Copyright © 2011-2022 走看看