IEEE 754浮点数十六进制相互转换 (32位 四字节 单精度)

IEEE 754浮点数十六进制相互转换 (32位 四字节 单精度)

常用方法

1. 使用联合体(Union)

通过定义一个联合体,其中包含一个float类型和一个unsigned char类型的数组,可以实现四个字节到浮点数的转换。

#include <stdio.h>union BytesToFloat {float f;unsigned char bytes[4];
};int main() {union BytesToFloat btf;btf.bytes[0] = 0x83; // 这些值只是示例btf.bytes[1] = 0x19;btf.bytes[2] = 0x49;btf.bytes[3] = 0x40;printf("Float is: %f\n", btf.f);return 0;
}

2. 使用指针类型转换

通过将字节数组的指针转换为浮点数的指针,可以直接读取字节数据作为浮点数。

#include <stdio.h>int main() {unsigned char bytes[4] = {0x83, 0x19, 0x49, 0x40}; // 示例字节float *f = (float*)bytes;printf("Float is: %f\n", *f);return 0;
}

3. 使用内存复制(memcpy)

memcpy函数也可以用来将字节数据复制到浮点数变量中。

#include <stdio.h>
#include <string.h>int main() {unsigned char bytes[4] = {0x83, 0x19, 0x49, 0x40}; // 示例字节float f;memcpy(&f, bytes, sizeof(f));printf("Float is: %f\n", f);return 0;
}

注意事项

  • 这些转换方法同样受到字节序(大小端)的影响。如果字节序不匹配,解释出的浮点数将是错误的。
  • 在处理不同硬件或跨平台数据传输时,确保对字节序有正确的处理。
  • 类似地,需要确保编译器的对齐设置不会影响到数据的正确解释。

一些问题

使用指针类型转换时可能会出现的问题

#include <stdio.h>int main() {unsigned char bytes[8] = {0, 0, 0, 0, 0x83, 0x19, 0x49, 0x40}; // 浮点数存储从第5个字节开始float *f = (float*)&bytes[3]; // &bytes[4] 可能未按float对齐要求进行对齐printf("Float is: %f\n", *f);return 0;
}
  • char 类型的数组通常不需要严格的内存对齐。这是因为 char 类型的数据是内存对齐的最小单位(1字节),所以它可以存储在任何地址上,而不会引起内存对齐相关的问题。

  • 对于大多数现代硬件和编译器而言,访问任意地址上的单个字节(即 char 类型的数据)都是合法且有效的。这与更大的数据类型(如 intfloatdouble)不同,后者可能需要存储在特定的内存地址(例如,2字节、4字节或8字节对齐的地址)以避免性能下降或硬件异常。

  • 因此,当你定义一个 char 数组时,无论其元素如何在内存中分布,都不会遇到因不遵守更大数据类型的对齐要求而引起的问题。这使得 char 数组特别适用于表示字符数据,包括字符串,因为它们可以从任何内存地址开始,并且可以在内存中连续存储,而不受对齐限制的影响。

  • 在实践中,这意味着即使在需要严格数据对齐的平台上,char 数组的处理也比对齐敏感的数据类型要简单得多,因为你不需要担心由于数据存储在非对齐地址上而导致的硬件异常或性能问题。

  • 硬件异常:许多处理器要求特定类型的数据在内存中按照特定的对齐方式存储。例如,许多平台要求float类型的数据地址必须是4的倍数。如果试图从一个未对齐的地址读取float数据,可能会导致硬件异常,程序可能会崩溃或行为异常。

  • 性能问题:即使在能够处理未对齐访问的处理器上,未对齐的访问也可能导致性能下降,因为处理器需要执行额外的操作来处理未对齐的数据。

推荐使用共用体

共用体(Union)在C语言中是一种特殊的数据类型,它允许在相同的内存位置存储不同的数据类型。共用体的内存对齐遵循一些特定的规则,旨在确保其成员可以有效地访问。下面详细解释共用体的内存对齐:

共用体的基本概念

共用体定义了一个可以存储多种类型的单一物理空间。成员共享相同的内存地址,但只能同时存储其中一种类型的值。共用体的大小至少为其最大成员的大小,并且可能因内存对齐要求而更大。

共用体的内存对齐规则
  1. 共用体的大小:共用体的总大小至少是其最大成员的大小,但可能会更大以满足特定平台的对齐要求。共用体的大小是其最大成员的大小的最小倍数,该倍数符合所有成员的对齐要求。

  2. 对齐要求:共用体的对齐要求是其所有成员对齐要求的最大值。这意味着,共用体的地址必须是其所有可能成员对齐要求的公倍数。

示例

考虑以下共用体:

union example {char a;  // 占用1字节int b;   // 占用4字节(假设int为4字节)
};
  • 大小:这个共用体的大小将是4字节,即int类型大小,因为这是共用体中最大的成员。
  • 对齐:假设int类型需要4字节对齐,则整个共用体需要按照4字节对齐。即使char类型的对齐要求是1字节,共用体的对齐要求依然是4字节。
内存访问
  • 当访问共用体的某个成员时,编译器会根据该成员的类型和偏移量来处理内存地址。在共用体的情况下,所有成员的起始地址相同,但解释存储在那里的数据的方式取决于访问的成员类型。
总结

共用体的内存对齐确保了无论哪个成员被访问,都能满足该成员类型的对齐要求,从而优化内存访问效率。在设计需要处理不同数据类型但不会同时使用它们的情况时,共用体是一个非常有用的工具。

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

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

相关文章

课时118:awk实践_基础实践_基础语法

1.1.2 基础语法 学习目标 这一节&#xff0c;我们从 信息查看、定制查看、小结 三个方面来学习 信息查看 字段提取 字段提取:提取一个文本中的一列数据并打印输出&#xff0c;它提供了相关的内置变量。$0 表示整行文本$1 表示文本行中的第一个数据字段$2 表示文本行中的第…

Python中GDAL批量将多个遥感影像各波段数值缩小10000倍的方法

本文介绍基于Python中的gdal模块&#xff0c;批量读取大量多波段遥感影像文件&#xff0c;分别对各波段数据加以数值处理&#xff0c;并将所得处理后数据保存为新的遥感影像文件的方法。 首先&#xff0c;看一下本文的具体需求。我们现有一个文件夹&#xff0c;其中含有大量.ti…

OceanBase 如何实现多层面的资源隔离

OceanBase的资源隔离涵盖了多个方面&#xff0c;如物理机器间的隔离、不同租户之间的隔离、同一租户内的隔离&#xff0c;以及针对大型查询请求的隔离等。在实际应用OceanBase的过程中&#xff0c;我们经常会遇到这些操作场景或产生相关需求。这篇文章针对这些内容进行了简要的…

代码随想录leetcode200题之栈与队列

目录 1 介绍2 训练3 参考 1 介绍 本博客用来记录代码随想录leetcode200题中栈与队列部分的题目。 2 训练 题目1&#xff1a;232. 用栈实现队列 C代码如下&#xff0c; #include <stack>class MyQueue { private:stack<int> a;stack<int> b; //辅助栈 pu…

软件测试--接口测试

接口测试&#xff1a;直接对后端服务的测试&#xff0c;是服务端性能测试的基础 接口&#xff1a;系统之间数据交互的通道 接口测试&#xff1a;校验接口响应数据与预期数据是否一致

docker私有仓库部署与管理

一、搭建本地公有仓库 1.1 首先下载registry镜像 docker pull registry 1.2 在daemon.json文件中添加私有镜像仓库地址并重新启动docker服务 vim /etc/docker/daemon.json 1.3 运行registry容器 docker run -itd -v /data/registry:/var/lib/registry -p 5000:5000 --restartal…

Rust 文档注释:文件注释//!和函数、结构体注释///

在 Rust 中&#xff0c;通常会在源代码文件的开头使用注释来提供有关文件、模块、版本、作者和其他相关信息的说明。这些信息可以帮助其他开发者更好地理解代码的背景和上下文。 以下是一个示例&#xff0c;展示了如何在 Rust 源代码文件的开头添加标题、版本、作者等信息&…

为什么叫“机器学习”Machine Learning 而不是“计算机学习”——深度学习Note

有一门学科“机器学习”火了起来&#xff0c;它是计算机科学与数学结合的产物&#xff0c;它的目的是使计算机“聪明”起来&#xff0c;实现人工智能。可是&#xff0c;令人困惑的是它明明就是计算机学习&#xff0c;为什么不叫“计算机学习”而叫“机器学习”呢&#xff1f;这…

04_SpringCloud

文章目录 单体架构与微服务架构的介绍单体架构微服务架构 微服务的实现服务之间的调用服务注册中心Eureka 注册中心Eureka的自我保护机制Nacos注册中心 单体架构与微服务架构的介绍 单体架构 单体架构 所有的代码最终打包成一个文件(jar包)&#xff0c;整个系统的所有功能单元…

(三十六)第 6 章 树和二叉树(二叉树的顺序存储表示实现)

1. 背景说明 2. 示例代码 1) errorRecord.h // 记录错误宏定义头文件#ifndef ERROR_RECORD_H #define ERROR_RECORD_H#include <stdio.h> #include <string.h> #include <stdint.h>// 从文件路径中提取文件名 #define FILE_NAME(X) strrchr(X, \\) ?…

[Kubernetes] Rancher 2.7.5 部署 k8s

server: 192.168.66.100 master: 192.168.66.101 node1: 192.168.66.102 文章目录 1.rancher server 安装docker2.部署k8s3.kubeconfig 1.rancher server 安装docker 所有主机开通ipv4 vi /etc/sysctl.conf#加入 net.ipv4.ip_forward 1#配置生效 sysctl -prancher-server开通…

【spark(零)】spark技术概览

文章目录 一. Spark入门二. Spark RDD与 Spark core三. Spark SQL四. Spark Streaming五. Spark内核原理 一. Spark入门 Spark基础知识 Spark部署模式、 Spark运行流程 【概述】spark&#xff08;一&#xff09;:spark特点、知识范畴、spark架构、任务提交流程、支持哪些运行…

鸿蒙准备1

鸿蒙心路 感慨索性&#xff0c; 看看鸿蒙吧。打开官网相关介绍 新建工程目录结构 感慨 最近面试Android应用开发&#xff0c;动不动就问framework的知识&#xff0c;什么touch事件的触发源是啥&#xff08;eventHub&#xff09;&#xff0c;gc流程是啥&#xff0c;图形框架是什…

美国纽扣电池UL4200A及16CFR1262标准亚马逊要求

2023年9月21日&#xff0c;美国消费品安全委员会CPSC(Consumer Product Safety Commission) 决定采用UL 4200A-2023&#xff08;包含纽扣电池或硬币电池的产品安全标准&#xff09;作为包含纽扣电池或硬币电池的消费品的强制性消费品安全规则&#xff0c;相关要求同时被编入到1…

超越视觉极限:深度学习图像超分辨率算法清单【第一部分】

超越视觉极限&#xff1a;深度学习图像超分辨率算法清单 简介2014年 - SRCNN (Super-Resolution Convolutional Neural Network)2016年 - VDSR (Very Deep Super Resolution)2016年 - LapSRN (Laplacian Pyramid Super-Resolution Network)2017年 - EDSR (Enhanced Deep Super-…

Linux Kernel入门到精通系列讲解(OpenSBI 篇) 3.1 OpenSBI 源码分析之汇编

1.概述 OpenSBI是什么?这个问题对于初学者来说很重要,OpenSBI主要的作用就是一段RISC-V架构程序跳转程序,它集成了许多常用的driver,方便使用者快速移植,学过ARM的应该都知道BL2,OpenSBI的作用就类似于BL2,一段运行在DDR上的程序,负责为U-boot等提供入口参数和程序跳转…

提供 DISC性格测试报告的全新 API接口,带给你惊喜的发现!

简介 DISC个性测验由24组描述个性特质的形容词构成&#xff0c;每组包含四个形容词&#xff0c;这些形容词是根据支配性&#xff08;D&#xff09;、影响性&#xff08;I&#xff09;、服从性&#xff08;C&#xff09;、 稳定性&#xff08;S&#xff09;和四个测量维度以及一…

Nacos面试题(一)

1. 简述什么是 Nacos&#xff1f; Nacos是Dynamic Naming and Configuration Service的简称&#xff0c;是一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。Nacos可以帮助应用实现服务注册、发现和负载均衡&#xff0c;同时方便地管理配置信息。 具体来说&…

JMeter - 如何测试REST API / 微服务

概述&#xff1a; 有许多方法和工具可用于测试REST API。 当我需要测试REST API时&#xff0c;在查看了各种工具和选项之后&#xff0c;由于以下原因&#xff0c;我选择了JMeter。 JMeter是免费和开源的。 JMeter可以从CSV文件中直接读取您的测试数据。参数化非常简单。 可以…

SparkSQL与Hive整合 、SparkSQL函数操作

SparkSQL与Hive整合 SparkSQL和Hive的整合&#xff0c;是一种比较常见的关联处理方式&#xff0c;SparkSQL加载Hive中的数据进行业务处理&#xff0c;同时将计算结果落地回Hive中。 整合需要注意的地方 1)需要引入hive的hive-site.xml&#xff0c;添加classpath目录下面即可…