以下程序,都是在 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) 工具转换结果如下:

lua 浮点转16进制 浮点数转化为16进制工具_开发语言

浮点数

单精度(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;
}

由于我的电脑系统是小端模式,所以低字节在前。

运行结果如下:

lua 浮点转16进制 浮点数转化为16进制工具_十六进制_02

(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;
}

由于我的电脑系统是小端模式,所以低字节在前。

运行结果如下:

lua 浮点转16进制 浮点数转化为16进制工具_lua 浮点转16进制_03

(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;
}

由于我的电脑系统是小端模式,所以低字节在前。

运行结果如下:

lua 浮点转16进制 浮点数转化为16进制工具_十六进制_02

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;
}

由于我的电脑系统是小端模式,所以低字节在前。

运行结果如下:

lua 浮点转16进制 浮点数转化为16进制工具_开发语言_05

(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;
}

由于我的电脑系统是小端模式,所以低字节在前。

运行结果如下:

lua 浮点转16进制 浮点数转化为16进制工具_开发语言_05

(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;
}

由于我的电脑系统是小端模式,所以低字节在前。

运行结果如下:

lua 浮点转16进制 浮点数转化为16进制工具_开发语言_05

三、十六进制(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;
}

运行结果如下:

lua 浮点转16进制 浮点数转化为16进制工具_浮点型_08

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;
}

运行结果如下:

lua 浮点转16进制 浮点数转化为16进制工具_浮点型_09