以下程序,都是在 C-Free5 的编译环境完成。
C语言 基础开发----目录
一、浮点数 数据结构
1. 单精度(float)浮点数----32位
具体结构如下表所示:
符号位 Sign (S) | 指数部分 Exponent (E) | 尾数部分 Mantissa (M) | ||||||||||||||||||||||||
31 | 30 | ~ | 23 | 22 | ~ | 0 | ||||||||||||||||||||
1bit | 8bit | 23bit |
2. 双精度(double)浮点数----64位
具体结构如下表所示:
符号位 Sign (S) | 指数部分 Exponent (E) | 尾数部分 Mantissa (M) | ||||
63 | 62 | ~ | 52 | 51 | ~ | 0 |
1bit | 11bit | 52bit |
二、浮点数 转 十六进制(HEX)
使用 浮点数 转 十六进制(HEX) 工具转换结果如下:
浮点数 | 单精度(float) 转 十六进制(HEX) | 双精度(double)转 十六进制(HEX) |
12.66 | 41 4A 8F 5C | 40 29 51 EB 85 1E B8 52 |
下面程序实现转换,依照这个转换结果,验证。
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 = 12.66;
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 = 12.66;
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 = 12.66;
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 = 12.66;
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 = 12.66;
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 = 12.66;
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] = {0x5C,0x8F,0x4A,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] = {0x52,0xB8,0x1E,0x85,0xEB,0x51,0x29,0x40};
double Ddata = 0;
memcpy(&Ddata,data,sizeof(Ddata));
printf("Ddata=%f\n",Ddata);
return 0;
}
运行结果如下: