32位十六进制浮点数转换为十进制浮点数的方法
? ? ? ? 這兩天在處理TCP發(fā)送數(shù)據(jù)的問(wèn)題,對(duì)方發(fā)來(lái)4個(gè)字節(jié)的浮點(diǎn)數(shù)的16進(jìn)制,當(dāng)時(shí)腦袋一懵,看著這4個(gè)16進(jìn)制的數(shù)不知道怎么轉(zhuǎn)成10進(jìn)制的浮點(diǎn)數(shù)了。
? ? ? ? 直到后來(lái)想到內(nèi)存中存放的數(shù)據(jù)的意義完全取決于讀取它的方式,例如:3F 80 00 00,按照整數(shù)去讀,其含義就是1065353216,但是按照浮點(diǎn)數(shù)讀,其結(jié)果就是1。
? ? ? ? 所以按照上述思路,解決該問(wèn)題的方法就是用不同的數(shù)據(jù)類型讀取該內(nèi)存,即可知道該值的具體含義。
? ? ? ? 栗子:
#include<iostream> using namespace std;int main() { unsigned char s[4]; s[0]=0x00; s[1]=0x00;s[2]=0x80;s[3]=0x3f; float *pf1=(float*)s;float f2;memcpy_s(&f2 , sizeof(float) , s , 4);cout<<"結(jié)果:"<<endl;cout<<"pf1 = "<<*pf1<<endl;cout<<"f2 = "<<f2<<endl;cin.get();return 0; }? ? 結(jié)果為:
? ? ? ? 有些小伙伴可能會(huì)有疑問(wèn),1的4個(gè)字節(jié)的十六進(jìn)制浮點(diǎn)數(shù)是 3F 80 00 00,為什么例程中 s 的數(shù)組中數(shù)值的順序是00 00 80 3F呢?其實(shí)該答案是因?yàn)槲业碾娔X的系統(tǒng)是Windows,所以在內(nèi)存中字節(jié)擺放時(shí)序是小端模式,即:低字節(jié)放入內(nèi)存低地址中,高字節(jié)放入高地址中。所以按照Windows檢測(cè),其s中數(shù)據(jù)的排布正好是3F 80 00 00。所以按照f(shuō)loat型讀取,該內(nèi)存中的值即為1
拓展
? ? ? ? 實(shí)際上32位十六進(jìn)制浮點(diǎn)數(shù)是如何轉(zhuǎn)換為十進(jìn)制浮點(diǎn)數(shù)的呢。咱們來(lái)舉栗說(shuō)明:
58 65 80 00,其二進(jìn)制為 0101 1000 0110 0101 1000 0000 0000 0000。
(1)符號(hào)位為0,則該浮點(diǎn)數(shù)是正數(shù)。
(2)指數(shù)部分為101 1000 0,轉(zhuǎn)換成十進(jìn)制為176,再減去127,得到指數(shù)位為49。
(3)尾數(shù)部分為110 0101 1000 0000 0000 0000,轉(zhuǎn)成小數(shù)的方法是從小數(shù)點(diǎn)開(kāi)始,第1個(gè)小數(shù)乘以2的(-1)次方,第2個(gè)小數(shù)乘以2的(-2)次方,以此類推,所有的結(jié)果相加就是小數(shù)。經(jīng)過(guò)計(jì)算,尾數(shù)部分的結(jié)果為0.79296875。
經(jīng)過(guò)上述操作,該實(shí)數(shù)為1.79296875*2的49次方,最終結(jié)果為:1.009351674298368*10的15次方。
?
關(guān)于float在內(nèi)存中的表達(dá)請(qǐng)看如下鏈接:https://blog.csdn.net/itworld123/article/details/78914969
?
(SAW:Game Over!)
總結(jié)
以上是生活随笔為你收集整理的32位十六进制浮点数转换为十进制浮点数的方法的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 通过TCP调试助手传输数据时的注意事项
- 下一篇: 计算器中 MS、MR、M+、M- 和 M