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.mfbz.cn/a/600521.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

sprig 项目启动时报错:MybatisDependsonDatabaseInitializationDetector

问题 使用application.yml启动项目报错&#xff1a; 解决方案 修改pom.xml: 修改这两处的版本

英语学习笔记4——Is this your ...?

Is this your …? 词汇 Vocabulary suit /sut/ n. 西装&#xff0c;正装 suit 的配套&#xff1a; shirt n. 衬衫tie n. 领带&#xff0c;领结belt n. 腰带trousers n. 裤子shoes n. 鞋子 school /skuːl/ n. 学校 所有学校 搭配&#xff1a;middle school 初中    hig…

Linux信号捕捉

要处理信号&#xff0c; 我们进程就得知道自己是否收到了信号&#xff0c; 收到了哪些信号&#xff0c; 所以进程需要再合适的时候去查一查自己的pending位图 block 位图 和 hander表&#xff0c; 什么时候进行检测呢&#xff1f; 当我们的进程从内核态返回到用户态的时候&…

3d模型实体显示有隐藏黑线?---模大狮模型网

在3D建模和设计领域&#xff0c;细节决定成败。然而&#xff0c;在处理3D模型时&#xff0c;可能会遇到模型实体上出现隐藏黑线的问题。这些黑线可能影响模型的视觉质量和呈现效果。因此&#xff0c;了解并解决这些隐藏黑线的问题至关重要。本文将探讨隐藏黑线出现的原因&#…

五一小长假,景区智慧公厕发挥了那些作用?

五一小长假已经过去&#xff0c;在旅途中相信大家非常开心&#xff0c;其中也不乏一些细节让你有了更好的体验&#xff0c;而在您享受美景、畅游风光的同时&#xff0c;或许并未留意到那个角落里&#xff0c;默默为您服务的智慧公厕。是的&#xff0c;它们将成为您旅途中不可或…

动态规划算法:简单多状态问题

例题一 解法&#xff08;动态规划&#xff09;&#xff1a; 算法思路&#xff1a; 1. 状态表⽰&#xff1a; 对于简单的线性 dp &#xff0c;我们可以⽤「经验 题⽬要求」来定义状态表⽰&#xff1a; i. 以某个位置为结尾&#xff0c;巴拉巴拉&#xff1b; ii. 以某个位置为起…

2024/5/7 QTday2

练习&#xff1a;优化登录框&#xff0c;输入完用户名和密码后&#xff0c;点击登录&#xff0c;判断账户是否为 Admin 密码 为123456&#xff0c;如果判断成功&#xff0c;则输出登录成功&#xff0c;并关闭整个登录界面&#xff0c;如果登录失败&#xff0c;则提示登录失败&a…

论文复现丨多车场带货物权重车辆路径问题:改进邻域搜索算法

引言 本系列文章是路径优化问题学习过程中一个完整的学习路线。问题从简单的单车场容量约束CVRP问题到多车场容量约束MDCVRP问题&#xff0c;再到多车场容量时间窗口复杂约束MDCVRPTW问题&#xff0c;复杂度是逐渐提升的。 如果大家想学习某一个算法&#xff0c;建议从最简单…

小红书餐饮推广怎么合作?纯干货

小红书作为国内领先的生活方式分享平台&#xff0c;其用户群体主要集中在一二线城市&#xff0c;年龄分布在18-35岁之间&#xff0c;其中女性用户占比高达80%。这部分用户具有较高的消费能力、审美追求和品质生活需求&#xff0c;对美食有着极高的兴趣和消费意愿&#xff0c;为…

流畅的python-学习笔记_设计模式+装饰器+闭包

策略模式 类继承abc.ABC即实现抽象类&#xff0c;方法可用abc.abstractmethod装饰&#xff0c;表明为抽象方法 装饰器基础 装饰器实际是语法糖&#xff0c;被装饰的函数实际是装饰器内部返回函数的引用 缺点&#xff1a;装饰器函数覆盖了被装饰函数的__name__和__doc__属性…

Nginx从入门到精通速成

文章目录 一. **Nginx** **的简介**1.1 什么是 **nginx**1.2 正向代理1.3 反向代理1.4 **负载均衡**1.5 动静分离 二. **Nginx** **的安装**三. **Nginx** **的常用的命令**四. **Nginx** **的配置文件**五. **Nginx** **配置实例**反向代理实例**1**5.1 实现效果5.2 准备工作5…

基于51单片机的自动售货机系统

一、项目概述 本文设计了一款以AT89C51单片机为核心的自动售货机系统&#xff0c;并且着重详细地介绍了自动售货机的整体系统设计方案、硬件选择基础、软件使用方法及技巧。 以AT89C51作为CPU处理单元连接各个功能模块&#xff1b;以44矩阵键盘作为输入控制模块对货物进行种类…

论文阅读:RHO-1:Not All Tokens Are What You Need 选择你需要的 Tokens 参与训练

论文链接&#xff1a;https://arxiv.org/abs/2404.07965 以往的语言模型预训练方法对所有训练 token 统一采用 next-token 预测损失。作者认为“并非语料库中的所有 token 对语言模型训练都同样重要”&#xff0c;这是对这一规范的挑战。作者的初步分析深入研究了语言模型的 t…

计算有效声压

计算有效声压 clear all; %%----------------------------------------------读取文件------------------------------------------ % 从wav文件读入语音数据&#xff0c;该语音采样率16k&#xff0c;故信号最高频率8k。 [x,fs]audioread(C2_3_y.wav); % 取x的一个通道 xx(:,1)…

【智能优化算法】海象优化器(Walrus optimizer,WO)

海象优化器(Walrus optimizer&#xff0c;WO)是期刊“EXPERT SYSTEMS WITH APPLICATIONS”&#xff08;中科院一区 IF 8.3&#xff09;的2024年智能优化算法 01.引言 海象优化器(Walrus optimizer&#xff0c;WO)的灵感来自海象通过接收关键信号(危险信号和安全信号)选择迁徙、…

CISAW应急服务:网络安全应急响应之路——从经验到认证的体会

随着信息技术的飞速发展&#xff0c;网络安全问题日益凸显。作为一名网络安全从业人员&#xff0c;我深知每一次安全事件给组织甚至国家带来的巨大损失和潜在影响。在多年的实际工作中&#xff0c;我积累了一些网络安全应急服务经验&#xff0c;并参加了信息安全保障人员认证&a…

鸿蒙内核源码分析(任务切换篇) | 看汇编如何切换任务

在鸿蒙的内核线程就是任务&#xff0c;系列篇中说的任务和线程当一个东西去理解. 一般二种场景下需要切换任务上下文: 在线程环境下&#xff0c;从当前线程切换到目标线程&#xff0c;这种方式也称为软切换&#xff0c;能由软件控制的自主式切换.哪些情况下会出现软切换呢? 运…

SSM+Vue+Element-UI实现教资考前指导系统

前言介绍 对于本教资考前指导系统的设计来说&#xff0c;系统开发主要是采用java语言技术&#xff0c;在整个系统的设计中应用MySQL数据库来完成数据存储&#xff0c;具体根据教资考前指导系统的现状来进行开发的&#xff0c;具体根据现实的需求来实现四六级在线考试系统网络化…

KUKA机器人故障报警信息处理(一)

1、KSS00276 机器人参数不等于机器人类型 ①登录专家模式 ②示教器操作&#xff1a;【菜单】—【显示】—【变量】—【单个】 ③名称输入&#xff1a;$ROBTRAFO[] 新值&#xff1a;TRAFONAME[] ④点击【设定值】。 2、电池报警&#xff1a; ①“充电电池警告-发现老化的蓄电池…

洗地机什么牌子最好?618高性价比家用洗地机品牌

随着科技的发展&#xff0c;智能智能清洁家电越来越受到消费者的欢迎。洗地机作为其中的佼佼者&#xff0c;已经成为许多家庭清洁的好帮手。然而&#xff0c;面对满目琳琅的洗地机品牌型号&#xff0c;究竟哪一款机型适合家用呢&#xff0c;正好618也临近了&#xff0c;又有哪些…