之前講過浮點數部分,參看:C語言再學習 – 浮點數
現在程序中要將浮點數,通過TCP發送。那得先將其轉換為十六進制才行呀。
那么問題就來了。
參看:C語言:單精度(float)和雙精度(double)浮點數 與 十六進制(HEX) 之間轉換
擴展:
STM32開發 – 進制與字符串間的轉換
一、浮點數 介紹
- 單精度浮點float:可以精確到小數點后6位
- 雙精度浮點double:可以精確到小數點后12位
C可以通過f或F后綴是編譯器把浮點常量當做float類型,比如2.3f和9.11E9F。
l或L后綴使一個數字成為long double類型,比如54.3l和4.32e4L。
建議使用L后綴,因為字母l和數字1容易混淆
沒有后綴的浮點常量為double類型。(重點)。例:sizeof(1.9) = 8;
浮點數二進制表達的三個組成部分
Sign(1bit):表示浮點數是正數還是負數。 0表示正數,1表示負數
Exponent(8bits):指數部分。 類似于科學技術法中的M*10^N中的N,只不過這里是以2為底數而不是10。需要注意的是,這部分中是以2 ^ 7-1即127,也即01111111代表2 ^ 0,轉換時需要根據127作偏移調整。
Mantissa(23bits):基數部分。 浮點數具體數值的實際表示。
單精度(float)浮點數----32位
具體結構如下表所示:
雙精度(double)浮點數----64位
二、浮點數十六進制轉換器
鏈接:浮點數十六進制轉換器v1.1
提取碼:775u
浮點數 13.88 單精度(float) 轉 十六進制(HEX)為 41 5E 14 7B 雙精度(double)轉 十六進制(HEX)為
40 2B C2 8F 5C 28 F5 C3
三、C語言實現 浮點數 轉 十六進制(HEX)
1、單精度(float) 轉 十六進制(HEX)
(1)指針法
具體代碼如下:
void Float_HEX (float fdata, unsigned char *hdata)
{unsigned char* tdata = (unsigned char*)(&fdata);hdata[0] = tdata[0];hdata[1] = tdata[1];hdata[2] = tdata[2];hdata[3] = tdata[3];
}
測試用例如下:
int main(int argc, char *argv[])
{unsigned char data[4] = {0,0,0,0};float fdata = 13.88;Float_HEX(fdata,data);for(int i=0;i<4;i++)printf("0x%X\n",data[i]);return 0;
}
由于我的電腦系統是小端模式,所以低字節在前。
運行結果如下:
(2)共用體法
具體代碼如下:
union {float fdata;unsigned char data[4];
}temp;
測試用例如下:
int main(int argc, char *argv[])
{temp.fdata = 13.88;for(int i=0;i<4;i++)printf("0x%X\n",temp.data[i]);return 0;
}
由于我的電腦系統是小端模式,所以低字節在前。
運行結果如下:
(3)memcpy()函數法
具體代碼如下:
void Float_HEX (float fdata, unsigned char *hdata)
{memcpy(hdata,&fdata,sizeof(fdata));
}
測試用例如下:
int main(int argc, char *argv[])
{unsigned char data[4] = {0,0,0,0};float fdata = 13.88;Float_HEX(fdata,data);for(int i=0;i<4;i++)printf("0x%X\n",data[i]);return 0;
}
由于我的電腦系統是小端模式,所以低字節在前。
運行結果如下:
2、雙精度(double)轉 十六進制(HEX)
(1)指針法
具體代碼如下:
void Double_HEX (double Ddata, unsigned char *hdata)
{unsigned char* tdata = (unsigned char*)(&Ddata);hdata[0] = tdata[0];hdata[1] = tdata[1];hdata[2] = tdata[2];hdata[3] = tdata[3];hdata[4] = tdata[4];hdata[5] = tdata[5];hdata[6] = tdata[6];hdata[7] = tdata[7];
}
測試用例如下:
int main(int argc, char *argv[])
{unsigned char data[8] = {0,0,0,0,0,0,0,0};double Ddata = 13.88;Double_HEX(Ddata,data);for(int i=0;i<8;i++)printf("0x%X\n",data[i]);return 0;
}
由于我的電腦系統是小端模式,所以低字節在前。
運行結果如下:
(2)共用體法
具體代碼如下:
union {double Ddata;unsigned char data[8];
}temp;
測試用例如下:
int main(int argc, char *argv[])
{temp.Ddata = 13.88; for(int i=0;i<8;i++)printf("0x%X\n",temp.data[i]);return 0;
}
由于我的電腦系統是小端模式,所以低字節在前。
運行結果如下:
(3)memcpy()函數法
具體代碼如下:
void Double_HEX (double Ddata, unsigned char *hdata)
{memcpy(hdata,&Ddata,sizeof(Ddata));
}
int main(int argc, char *argv[])
{unsigned char data[8] = {0,0,0,0,0,0,0,0};double Ddata = 13.88;Double_HEX(Ddata,data);for(int i=0;i<8;i++)printf("0x%X\n",data[i]);return 0;
}
由于我的電腦系統是小端模式,所以低字節在前。
運行結果如下:
四、十六進制(HEX) 轉 浮點數
1、十六進制(HEX) 轉 單精度(float)
具體代碼如下:
int main(int argc, char *argv[])
{char data[4] = {0x7B,0x14,0x5E,0x41};float fdata = 0;memcpy(&fdata,data,sizeof(fdata));printf("fdata=%f\n",fdata);return 0;
}
運行結果如下:
2、十六進制(HEX) 轉 雙精度(double)
具體代碼如下:
int main(int argc, char* argv[])
{char data[8] = { 0xC3,0xF5,0x28,0x5C,0x8F,0xC2,0x2B,0x40 };double Ddata = 0;memcpy(&Ddata, data, sizeof(Ddata));printf("Ddata=%f\n", Ddata);return 0;
}
運行結果如下:
五、浮點二進制轉換工具
參看:浮點二進制轉換工具