C语言:十六进制(HEX)和浮点类型(float、double)转换
目錄
1、浮點類型轉換為十六進制
方法1:用地址用指針
方法2:用共用體
方法3:?使用memcpy
2、十六進制轉換為浮點類型
近日在研究Modbus協議的時候遇到這樣一個情況:使用ModScan32軟件,可將HEX和浮點類型轉換,如下所示:
那么如何在程序設計中實現十六進制和浮點類型轉換呢?
C語言和C#語言中,對于浮點類型的數據采用單精度類型(float)和雙精度類型(double)來存儲,float數據占用32bit,double數據占用64bit,我們在聲明一個變量float f= 2.25f的時候,是如何分配內存的呢?如果胡亂分配,那世界豈不是亂套了么,其實不論是float還是double在存儲方式上都是遵從IEEE的規范的,float遵從的是IEEE R32.24 ,而double 遵從的是R64.53。
無論是單精度還是雙精度在存儲中都分為三個部分:
1、符號位(Sign) :0代表正,1代表為負;
2、指數位(Exponent):用于存儲科學計數法中的指數數據,并且采用移位存儲;
3、尾數部分(Mantissa):尾數部分。
其中float的存儲方式如下圖所示:
而雙精度的存儲方式為:
了解了基本概念后咱就開始代碼實現吧~
1、浮點類型轉換為十六進制
方法1:用地址用指針
#include "stdio.h"int main(void)
{float fa = 123.56;char farray[4] = {0};*(float*)farray = fa;printf("%f\n",*(float*)farray);return (0);
}
輸出結果:
123.559998
方法2:用共用體
#include "stdio.h"union {float fa;char farray[4];
}utemp;int main(void)
{int i = 0;float ft = 0.0;utemp.fa = (float)123.56;ft = *(float*)utemp.farray;printf("%f\n",ft);return (0);
}
?輸出結果:
123.559998
方法3:?使用memcpy
#include "stdio.h"
#include "string.h"int main(void)
{float fa;char farray[4];float ft; fa = 45.23;memcpy(farray,&fa,sizeof(farray));memcpy(&ft,&farray,sizeof(farray)); printf("%f\n",ft);return (0);
}
?輸出結果:
45.230000
2、十六進制轉換為浮點類型
#include "stdio.h"int main(void)
{unsigned char pMem[] = {0x66,0xE6,0xF0,0x42};float *p = (float*)pMem;printf("%g\r\n",*p);return 0;
}
??輸出結果:
120.45
?最后為各位分享一個十分便利的十六進制和浮點類型互相轉換的小工具:
參考鏈接,拓展學習:
1、浮點數類型在計算機里面的表示方法
2、浮點數在計算機中存儲方式
3、如何把一個float存到一個長度為4的char數組中?
總結
以上是生活随笔為你收集整理的C语言:十六进制(HEX)和浮点类型(float、double)转换的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 力扣(LeetCode)刷题,简单题(第
- 下一篇: 力扣(LeetCode)刷题,简单题(第