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 即為所需計算的浮點數值。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM