32位十六进制浮点数转十进制

时间:2024-03-04 16:34:26

之所以会遇到这个问题,是因为在一次做项目中,调试所用的小板是通过串口输出十六进制的浮点数。例如 “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 即为所需计算的浮点数值。