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的项目。

Torn Lucky Ticket

题目 #include<bits/stdc.h> using namespace std; #define int long long const int maxn 1e6 5, d 500; vector<string> vec[6]; int mp[1005]; signed main(){int n;cin >> n;for(int i 1; i < n; i){string s;cin >> s;int len s.size();…

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

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

28 动态规划解按摩师的最长预约时间

问题描述&#xff1a;一名有名的按摩师会受到源源不断的预约请求&#xff0c;每个预约都可以选择接或者不接&#xff0c;在每次预约服务之间要有休息时间&#xff0c;因此不能接相邻的预约&#xff0c;给定一个请求序列&#xff0c;按摩师找到最优的预约集合(总预约时间最长)&a…

探索中文文本处理利器 - 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免密登录&…

Java基础——对象类型转换(向上、向下转型)

非继承关系的类之间对象类型不可以互相类型转换&#xff0c;只有继承关系才可以互相转换。 简单说&#xff0c;对象类型转换的前提要是继承关系。 对象类型转换分为&#xff1a;向上转型和向下转型。多态就是一种自动向上转型。 向上转型&#xff1a;子类对象用父类类型接收…

Leetcode 2963. Count the Number of Good Partitions

Leetcode 2963. Count the Number of Good Partitions 1. 解题思路2. 代码实现 题目链接&#xff1a;2963. Count the Number of Good Partitions 1. 解题思路 这一题根据题意&#xff0c;显然我们可以将其先分为 n n n个原子partition&#xff0c;确保任意两个partition之间…

git 常用的使用方法

1.查看分支 $ git branch #查看本地分支 $ git branch -r #查看远程分支 $ git branch -a #查看所有分支 $ git branch -vv #查看本地分支及追踪的分支 2.创建分支 方法1 $ git branch 分支名 #创建本地分支 #将本地分支push&#xff0c;就创建了远程分支方法2 #创建本地分…

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

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

Java 并发编程(一)

1、在 java 中守护线程和本地线程区别&#xff1f; java 中的线程分为两种&#xff1a;守护线程&#xff08;Daemon&#xff09;和用户线程&#xff08;User&#xff09; 任何线程都可以设置为守护线程和用户线程&#xff0c;通过方法 Thread.setDaemon(boolon)&#xff1b;tru…

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

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

如何找到MACOS系统更新的安装包

首先在应用商店中下载新系统的安装包&#xff0c;然后在设置中不要点安装&#xff0c;会自动跳出安装的界面&#xff0c;不要关闭界面&#xff0c;打开命令行用root权限输入命令cat /var/log/install.log | grep *.dmg&#xff0c; 就会显示 sh-3.2# cat /var/log/install.log …

算法基础十

加一 给定一个由 整数 组成的 非空 数组所表示的非负整数&#xff0c;在该数的基础上加一。最高位数字存放在数组的首位&#xff0c; 数组中每个元素只存储单个数字。 示例 1&#xff1a; 输入&#xff1a;digits [1,2,3] 输出&#xff1a;[1,2,4] 解释&#xff1a;输入数组表…

YOLO_embedded: YOLO算法快速嵌入式部署

YOLO_embedded&#xff1a; YOLO算法快速嵌入式部署 for UbuntuBased on YOLOXOpenVINO & TensorRT 本项目提供c和python两种语言&#xff0c;详情请见各个文件夹下的README.md 安装OpenVINO 点此进入官网选择版本进行下载&#xff0c;然后打开install_openvino.sh将相…