之所以會遇到這個問題,是因為在一次做項目中,調試所用的小板是通過串口輸出十六進制的浮點數。例如 “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 即為所需計算的浮點數值。