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