C语言:单精度(float)和双精度(double)浮点数 与 十六进制(HEX) 之间转换

以下程序,都是在 C-Free5 的编译环境完成。
C语言 基础开发----目录


一、浮点数 数据结构

1. 单精度(float)浮点数----32位

具体结构如下表所示:

符号位 Sign (S)指数部分 Exponent (E)尾数部分 Mantissa (M)
3130~2322~0
1bit 8bit 23bit

2. 双精度(double)浮点数----64位

具体结构如下表所示:

符号位 Sign (S)指数部分 Exponent (E)尾数部分 Mantissa (M)
6362~5251~0
1bit 11bit 52bit

二、浮点数 转 十六进制(HEX)

使用 浮点数十六进制(HEX) 工具转换结果如下:
在这里插入图片描述

浮点数单精度(float) 转 十六进制(HEX)双精度(double)转 十六进制(HEX)
12.6641 4A 8F 5C40 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;
}

运行结果如下:
在这里插入图片描述


  • 13
    点赞
  • 95
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 6
    评论
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

根号五

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值