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

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

五、浮点二进制转换工具

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/212014.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

(JAVA)-打印流

打印流是高级流&#xff0c;只能写不能读&#xff0c;只有输出流 只操作文件目的地&#xff0c;不操作数据源 能实现数据的原样输出 printStream:字节打印流 构造方法&#xff1a; 用文件或地址的方式创建字节打印流也会创建一个字节基本流。 字节流底层没有缓存区&#xff…

文档或书籍扫描为 PDF:ScanPapyrus Crack

ScanPapyrus 可让您快速轻松地将文档或书籍扫描为 PDF&#xff0c;批处理模式使扫描过程快速高效&#xff0c;自动处理书籍并将其拆分为单独的页面 用于快速扫描文档、书籍或打印照片的扫描仪软件 快速扫描文档 使用此扫描仪软件&#xff0c;您无需在扫描仪和计算机之间来回移动…

SpringBoot 官方脚手架不再支持Java8和Java11

Spring 官方脚手架不再支持初始化 Java8 和 Java 11 项目&#xff0c;目前仅支持初始化Java17 和 Java21 项目。 阿里巴巴Spring脚手架支持初始化Java8、Java11、Java17、Java19 的项目&#xff0c;不支持初始化Java21的项目。

java简述springboot内置数据库 并举例启动h2内存数据环境

在前面 我们讲了 springboot 给我们提供了 默认的 数据源 默认 HikariCP 以及其他两种内置数据源 持久化技术 JdbcTemplate 那么 说起来很多人难以置信 不过 springboot 也真的给我们内置了数据库技术 而且不止一种 是三种 这三个数据库的特点在于 它们都是用java语言写的 就表…

探索中文文本处理利器 - Python jieba库详解

更多资料获取 &#x1f4da; 个人网站&#xff1a;ipengtao.com jieba库介绍 在处理中文文本数据时&#xff0c;分词是一项至关重要的任务。而在Python的工具箱中&#xff0c;jieba库作为一款强大的中文分词工具&#xff0c;为开发者提供了高效而灵活的解决方案。jieba&#…

JDK8新特性:Lambda表达式规则及用法,方法引用

目录 Lambda表达式是JDK8新增的一种语法格式 1.作用 2.用法规则&#xff1a; 3.方法引用 Lambda表达式是JDK8新增的一种语法格式 1.作用 简化匿名内部类的代码写法 Lambad用法前提&#xff1a;只能简化函数式接口&#xff08;一般加有Funcationallnterface&#xff09;&a…

Python dateutil 库:简化日期和时间处理的利器

更多资料获取 &#x1f4da; 个人网站&#xff1a;ipengtao.com 在Python中&#xff0c;处理日期和时间是常见的任务之一。dateutil库是Python标准库中datetime模块的扩展&#xff0c;提供了许多方便的工具和函数&#xff0c;简化了日期和时间的操作。 安装与基本用法 首先&…

小黑子之——MybatiPlus整合

MybatiPlus学习 一、MybatiPlus简介1.1 入门案例1.2 mybatisPlus概述1.3 总结 二、标准数据层开发2.1 标准的CRUD使用2.2 新增2.3 删除2.4 修改2.5 根据Id查询2.6 查询全部2.7 Lombok2.8 分页功能 三、DQL控制3.1 条件查询方式3.1.1 构建条件查询3.1.2 多条件查询3.1.3 null值判…

运维05:自动化

人工运维时代 运维人员早期需要维护众多的机器&#xff0c;因此需要执行很多重复的劳动&#xff0c;很多机器需要同时部署相同的服务或者是执行相同的命令&#xff0c;还得反复地登录不同的机器&#xff0c;执行重复的动作 自动化运维时代 早期运维人员会结合ssh免密登录&…

载入了名字空间‘htmltools’ 0.5.6,但需要的是>= 0.5.7解决方案

解决方案&#xff1a;删除之前的旧版本安装包&#xff0c;安装新的包 1.卸载之前的安装包 2.关闭R&#xff0c;重新打开 3. # install.packages("htmltools") library(htmltools)

HarmonyOS学习--了解基本工程目录

1.工程级目录 工程的目录结构如下&#xff1a; 其中详细如下&#xff1a; AppScope中存放应用全局所需要的资源文件。entry是应用的主模块&#xff0c;存放HarmonyOS应用的代码、资源等。oh_modules是工程的依赖包&#xff0c;存放工程依赖的源文件。build-profile.json5是工…

Linux_CentOS_7.9 VNC安装卸载以及相关配置开机自启动服务简易记录

VNC安装卸载以及相关配置开机自启动服务&#xff1a; 查看环境&#xff1a;&#xff08;yum镜像源配置可以参考我之前文章里面有详细参考http://t.csdnimg.cn/mzGoI&#xff09; [rootorcl238 ~]# rpm -qa | grep vnc ##查看系统现有VNC软件版本 gtk-vnc2-0.7.0-3.el7.x86…

简易加减运算器的制作----数字电路设计(含proteus仿真)

简易加减运算器的制作 一、功能要求—基本功能 1、自制0-9按键&#xff0c;在一个LED数码管上稳定地显示当前按下的值。&#xff08;基本功能&#xff09; 2、增加、两个按键&#xff0c;实现0-9两个一位数的加法运算&#xff0c;同时在两位LED上稳定地显示运算结果。&#…

MTU与MSS

MTU&#xff1a;一个网络包的最大长度&#xff0c;以太网中一般为1500各字节。 MSS&#xff1a;除去头部之后&#xff0c;一个网络包所能容纳的TCP数据的最大长度。 应用程序调用write后&#xff0c;将要发送的数据被交给TCP/IP协议栈进行。 协议栈不关心应用的数据内容&…

四:爬虫-Cookie与Session实战

四&#xff1a;Cookie与Session实战 ​ 在浏览网站的过程中&#xff0c;我们经常会遇到需要登录的情况&#xff0c;有些页面只有登录之后才可以访问。在登录之后可以连续访问很多次网站&#xff0c;但是有时候过一段时间就需要重新登录。还有一些网站&#xff0c;在打开浏览器…

c语言归并排序(详解)

归并排序是一种分治算法&#xff0c;它将列表分割成较小的子列表&#xff0c;然后递归地对子列表进行排序&#xff0c;最后将这些子列表合并以产生已排序的列表。基本概念包括&#xff1a; 分割&#xff1a;将列表分割成较小的子列表&#xff0c;直到子列表的长度为1或0。排序…

Leetcode—219.存在重复元素II【简单】

2023每日刷题&#xff08;五十三&#xff09; Leetcode—219.存在重复元素II 实现代码 class Solution { public:bool containsNearbyDuplicate(vector<int>& nums, int k) {unordered_map<int, int> m;int n nums.size();for(int i 0; i < n; i) {if(m…

漏洞复现-大华dss struts2-045表达式注入漏洞(附漏洞检测脚本)

免责声明 文章中涉及的漏洞均已修复&#xff0c;敏感信息均已做打码处理&#xff0c;文章仅做经验分享用途&#xff0c;切勿当真&#xff0c;未授权的攻击属于非法行为&#xff01;文章中敏感信息均已做多层打马处理。传播、利用本文章所提供的信息而造成的任何直接或者间接的…

【webpack】初始化

webpack 旧项目的问题下一代构建工具 Vite 主角 &#xff1a;webpack安装webpack1&#xff0c;mode的选项2&#xff0c;使用source map 精准定位错误行数3&#xff0c;使用watch mode(观察模式)&#xff0c;自动运行4&#xff0c;使用webpack-dev-server工具&#xff0c;自动刷…

Linux_CentOS_7.9配置oracle sqlplus、rman实现上下按键切换历史命令等便捷效率功能之简易记录

配置oracle sqlplus以及rman可以上下按键切换历史命令等便捷效率功能 设置前提是已经yum安装了rlwrap软件具体软件下载及配置参考文章http://t.csdnimg.cn/iXuVK su - oracleVim .bash_profile ## 文件中增加如下的别名设置 ---------------- alias sqlplusrlwrap sqlplus…