【C语言】第六课 联合体(Union)和位域(Bit-field)

别再乱用宏定义和魔数了!用C语言联合体位域清晰管理你的协议数据包 本文探讨了如何利用C语言的联合体(union)和位域(bit-field)技术优雅地设计通信协议,避免使用宏定义和魔数带来的维护难题。通过实际代码示例展示了如何清晰管理协议数据包中的各个标志位,提升代码可读性、可维护性和类型安全性,特别适用于嵌入式系统和网络通信开发。 阅读详情

C语言中的联合体(Union)和位域(Bit-field)是处理内存布局和实现数据高效存储的强力工具,尤其在底层编程、协议解析和逆向工程中非常重要。

🧠 1. 联合体(Union)

联合体是一种特殊的自定义数据类型,它允许在同一块内存空间中存储不同类型的数据成员,但在任意时刻只能使用其中一个成员。

1.1 定义与基本使用

使用 union 关键字定义联合体,其语法与结构体类似:

union Data {
   
   
    int i;        // 整型成员
    float f;      // 浮点成员
    char str[20]; // 字符数组成员
};
  • 内存共享:所有成员共享同一段内存,联合体的大小由其最大成员决定(例如上例中约为20字节,取决于 char str[20] 和系统对齐规则)。
  • 访问成员:使用点操作符 . 访问联合体变量的成员,若通过指针访问则使用箭头操作符 ->。
    union Data data;
    data.i = 10;       // 此时联合体存储的是整数
    printf("%d\n", data.i);
    
    data.f = 220.5;    // 写入浮点数,覆盖之前的整数值
    printf("%f\n", data.f);
    
  • 初始化:联合体初始化时只能初始化其第一个成员。
    union Data data = {
         
         10}; // 正确:初始化第一个成员i
    // union Data data = {.f = 220.5}; // C99后允许指定初始化成员,但仍需注意覆盖
    
1.2 内存布局与逆向重点

联合体的所有成员都从相同的内存地址开始存储。这意味着改变一个成员的值会直接影响其他成员的值,因为它们操作的是同一片内存区域的不同解释方式。

#include <stdio.h>
#include <stdint.h>

联合体与位域 阅读详情

相关推荐

用C语言联合体(union)和位域(bit-field)优雅管理Modbus通讯状态机

本文介绍了如何利用C语言的联合体(union)和位域(bit-field)技术高效管理Modbus通讯状态机。通过5个关键技巧,包括内存布局优化、多视图访问模式设计、中断安全的原子操作、协议版本兼容性扩展和调试增强,显著提升嵌入式系统的内存利用率和代码可维护性。特别适用于485总线等资源受限的工业控制场景。

weixin_26821003的博客 353

字节序 位域 联合 (bit field and union)

在c/c++语言中,如果仅仅使用状态位。可以使用位域和联合一起来使用。但是要注意字节序问题。 例如在游戏里面可以使用 一个char 8bit 来表示8种状态。比如: 地图格式属性,BUFF状态。 union BitField {     unsigned char  flag ;     struct     {         unsigned char

sunning9001的专栏 1881

C语言联合体(union)的灵活使用

在C语言有一类数据与结构体相似,只是应用的场景不同,这类数据类型叫联合体。具体联合体的解释可以参考其他文档,本文只是从联合体数据类型推导出来的一种使用场景。在编程中经常需要给一个字节的某1个bit赋予含义,比如一个字节的bit0是操作成功,bit1 操作失败, bit2 数据读取完成等。要实现这样的功能有多种方法。

清风不知妻美的博客 763

从Modbus协议解析到C语言联合体:我是如何用位域优雅处理设备状态字的(实战分享)

本文分享了在工业通信和物联网开发中,如何利用C语言的联合体和位域特性优雅处理Modbus设备状态字。通过实战案例展示了如何替代传统的移位和掩码操作,提升代码可读性和维护性,同时确保性能和内存效率。特别适合嵌入式系统开发者优化设备状态处理逻辑。

weixin_30596735的博客 350

红外协议 IR NEC 协议深度解析-简单易懂协议详解

1. 协议特征 使用双向编码(又称曼彻斯特编码); 使用38K载波对编码后的波形进行调制; 位时间 1.12ms 或 2.25ms 2. 调制 定义脉冲560µS为脉冲基本宽度T; 根据脉冲时间长短来解码。推荐载波占空比为1/3至1/4: (1) Logic “1” 位宽为2.25ms,脉冲时间560us(T + 3T); (2) Logic “0” 位宽为1.12ms,脉冲时间560us(T + T)。 (3 ) 重复码: 位宽为11.25ms,脉冲时间9ms(16T + 4T)。 3. 协议

代码打工人的博客 1万+

ThingsBoard入门实战(七):公共发布和 UI 细节修改

公共发布和 UI 细节修改7.细节修改和公共发布一、公共发布二、UI优化下载运行修改三、下一步还可以做什么?更好的UI更丰富的系统模块 7.细节修改和公共发布 GET到新技能了,想给兄弟们演示,需要给他们每个人一个账号么? 答案肯定是:不需要! ThingsBoard 用 公共发布 解决了这个问题。 一、公共发布 首先我们来看一下路灯设备现在在谁名下? 如下图,路灯都是customerA的, 目前只有它和它的租户可以看到,其他人需要看就需要设为公有。 如图操作: 对于设备详情仪表盘,我们也需要设为公有

AIGC搞起 9119

华为昇腾Atlas200DK. CANN模型推理——目标检测结果不对(无检测结果)的问题解决

目录前言问题描述问题排查1.后处理模块问题排查2.预处理模块问题排查3.模型问题排查4.算法bug问题排查5.AI板卡问题排查6.模型精度问题排查6.模型推理问题解决:模型输入数据与预处理不同后记 前言 上周我在华为昇腾Atlas200DK中部署nanodet和yolov5时,出现了目标检测结果不对(没有检测到任何物体),困扰了整整三天,最后找到原因并圆满解决,在这里记录一下debug过程。 以上测试均在python中完成。 问题描述 第一天上午,我首先将nanodet由pytorch的.pth模型转换为.

qq_41035283的博客 5604

避坑指南:MTK平台Widevine L1密钥安装全流程详解(含SP META工具使用与Log分析)

本文详细解析了MTK平台实现Widevine L1认证的全流程,涵盖密钥申请、格式转换、安全烧录等关键步骤,特别针对Trustonic TEE环境下的SP META工具使用与日志分析提供实用指南。帮助开发者规避常见错误,确保DRM密钥安全部署,满足高端内容保护需求。

weixin_27219587的博客 476

海思Hi3061M MCU:为高速吹风筒市场注入智能动力

此外,海思还提供了丰富的软件开发工具和生态环境组件,帮助开发者快速实现复杂功能。高速吹风筒因其高效的风力和快速的干燥效果,近年来在市场上越来越受欢迎。然而,传统的高速吹风筒在性能、噪音和使用寿命等方面仍有改进的空间。凭借其高性能、低功耗、低噪声和易用的开发工具,为高速吹风筒市场带来了全新的解决方案。这不仅提高了用户的使用体验,还延长了电机的使用寿命。这不仅减少了电机的电磁噪声,还提高了电机的运行效率。还支持风机顺逆风启动适配多种电阻范围的电机,进一步提高了吹风筒的适用性和灵活性。

2401_83448585的博客 2016

conda install出现CondaValueError: Malformed version string invalid character(s)解决方案

本文主要介绍了conda install出现Solving environment:failed、CondaValueError: Malformed version string invalid character(s),希望能对新手有所帮助。 文章目录 1. 问题描述 2. 解决方案 2.1 步骤一 2.2 步骤二 2.3 步骤三

weixin_43178406的博客 6万+

【系统分析师】高分论文:论软件需求验证方法及应用

本文以某清算平台建设项目为例,探讨了软件需求验证方法的应用。该项目旨在隔离银行与支付公司的直接通信,满足央行监管要求。作为系统分析师,作者通过需求测试和需求评审两种方法确保需求质量。需求测试采用概念测试用例提前发现问题;需求评审通过正式与非正式形式多方确认需求。项目结合邮件评审、专家会议等方式,最终形成完善的需求文档。平台上线后运行良好,验证了需求管理的重要性。该案例表明,科学的需求验证是项目成功的关键保障。

数据知道的博客 8125

全面解读 SAP Business Data Cloud

SAP 在 2025 年初正式推出(简称BDC),它把、以及全新的统一封装为一项完全托管的 SaaS 服务,配套交付“语义层 + 数据产品 + 智能应用”三层能力,为企业构建真正贴近业务语境的 “Business Data Fabric”。这一方案不仅解决了跨系统数据碎片化、治理难及 AI 训练数据可信度低的问题,还为现有 BW 客户、S/4HANA以及第三方工作负载提供云上现代化路径和零拷贝数据共享机制。本文将围绕技术架构、核心组件、业务场景、迁移路线及未来展望展开,以 Henkel 等真实案例佐证。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 909

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

上一篇: 【C语言】第五课 结构体与内存对齐​​
下一篇: 【C语言】第七课 字符串与危险函数​​
jiaway
博客等级 码龄11年 39粉丝 92原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值