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

之前讲过浮点数部分,参看: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;
}

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

五、浮点二进制转换工具

参看:浮点二进制转换工具
在这里插入图片描述

相关推荐

  1. QT c++ 精度点数转换成4个16位数

    2023-12-07 11:28:02       32 阅读
  2. 单精度(float精度double)的区别

    2023-12-07 11:28:02       34 阅读
  3. 点数精度问题

    2023-12-07 11:28:02       36 阅读
  4. C++设置点数精度

    2023-12-07 11:28:02       15 阅读
  5. C 语言实例 - 输出精度double)数

    2023-12-07 11:28:02       10 阅读
  6. STM32 float点数转换成四个字节

    2023-12-07 11:28:02       8 阅读

最近更新

  1. TCP协议是安全的吗?

    2023-12-07 11:28:02       16 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2023-12-07 11:28:02       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2023-12-07 11:28:02       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2023-12-07 11:28:02       18 阅读

热门阅读

  1. docker安装sybase数据库

    2023-12-07 11:28:02       35 阅读
  2. Mysql大数据量删除

    2023-12-07 11:28:02       30 阅读
  3. 【前端】windows下nvm安装node、npm的一些坑

    2023-12-07 11:28:02       44 阅读
  4. Ubuntu18.04的VSCode输入不了中文

    2023-12-07 11:28:02       42 阅读
  5. Spring MVC详解

    2023-12-07 11:28:02       27 阅读
  6. MFC中updatedata(False)和Updatedata(TRUE)区别

    2023-12-07 11:28:02       32 阅读
  7. Redis小知识

    2023-12-07 11:28:02       34 阅读
  8. 【力扣100】 3.最长连续序列

    2023-12-07 11:28:02       44 阅读
  9. leetcode每日一题4

    2023-12-07 11:28:02       35 阅读
  10. 向量数据库,展望AGI时代

    2023-12-07 11:28:02       32 阅读