C语言结构体位域的使用技巧(联合体妙用)

联合体与位域 阅读详情

C语言结构体位域的使用技巧

基本概念

  • 在C语言中,位域(Bit Fields)是一种数据结构,它允许程序员访问内存中的单个位。位域通常用于硬件编程,例如嵌入式系统开发,因为它们允许程序员直接访问和控制硬件寄存器的特定位。位域在不同的编译器和平台上可能会有不同的内存对齐和打包行为,因此在移植代码时需要小心。

基本语法

  • struct {
        unsigned int member1 : n1;
        unsigned int member2 : n2;
        // ... 可以继续添加更多的位域成员
    } yourStructName;
    
    • unsigned int 表示位域成员的数据类型,通常是 unsigned int,但也可以是 signed int 或 _Bool。
    • member1 和 member2 是位域成员的名称。
    • : n1 和 : n2 指定了每个成员所占用的位数,n1 和 n2 是介于1到数据类型大小之间的整数。

    位域成员可以是无符号的或有符号的,取决于它们前面的关键字 unsigned 或 signed。如果省略了这些关键字,位域默认为无符号。

    位域成员的总位数不能超过它们所属的数据类型的大小。例如,如果使用 unsigned int(通常是32位),则所有位域成员的位数总和不能超过32位。

举例

  • #include <stdio.h>
    
    struct BitField {
        unsigned int is_enabled : 1;   // 占用1位
        unsigned int has_data   : 1;   // 占用1位
        unsigned int error_code : 6;   // 占用6位
        unsigned int mode       : 2;   // 占用2位
        unsigned int reserved   : 22;  // 占用22位,通常用于对齐或保留
    };
    
    int main() {
        struct BitField myBitField;
        myBitField.is_enabled = 1;
        myBitField.has_data = 0;
        myBitField.error_code = 31; // 只有最低6位会被使用
        myBitField.mode = 3;
    
        printf("is_enabled: %d\n", myBitField.is_enabled);
        printf("has_data: %d\n", myBitField.has_data);
        printf("error_code: %d\n", myBitField.error_code);
        printf("mode: %d\n", myBitField.mode);
    
        return 0;
    }
    

但是

  • 嵌入式一般在搞寄存器的时候会用到位域,像上面这个例子,但是我没法把 myBitField 这个结构体当成数值来用,除非用指针强转,但是这个行为存在危险性。那么怎么搞?嘿嘿,整个联合体就好了。

    typedef union {
        struct {
            unsigned int is_enabled : 1;   // 占用1位
        	unsigned int has_data   : 1;   // 占用1位
        	unsigned int error_code : 6;   // 占用6位
        	unsigned int mode       : 2;   // 占用2位
        	unsigned int reserved   : 22;  // 占用22位,通常用于对齐或保留
        } Bits;
        unsigned int  Value;
    } Super;
    

    联合体(union)的一个主要特性是它所有的成员都占用相同的内存位置。这意味着,你改结构体就是在改Value。给结构体赋完值以后,直接用Value就行!

【C语言】结构体位域 文章目录(一) 位域(二)举例说明(三)主要用途(四)看清区别,理解本质(五)匿名位域(六)只要是结构体,就要遵循内存对齐 (一) 位域 有些数据在存储时并不需要占用一个完整的字节,只需要占用一个或几个二进制位即可。例如开关只有通电和断电两种状态,用 0 和 1 表示足以,也就是用一个二进位。正是基于这种考虑,C语言又提供了一种叫做位域的数据结构。 注:其中位域的值不能超过该数据类型的最大二进制位个数,例char 一字节(8位),意味着位域的值<=8 (二)举例说明 #include <stdi 阅读详情

相关推荐

C语言:【位域操作】(结构体中使用冒号)

文章目录一、 什么是C语言位域操作(结构体中使用冒号)1.1 位操作1.2 位域操作产生的原因1.3 位域操作1.4 备注二、位域操作示例——4字节(32bit)变量操作2.1 代码2.2 打印结果三、位域操作示例——1字节(8bit)变量操作3.1 代码3.2 打印结果四、寄存器定义使用示例——32位寄存器实例4.1 结构体定义:头文件reg.h中定义寄存器通用类型4.2 结构体定义:头文件am437x_io_mux.h中定义外设模块寄存器4.3 结构体使用:文件spi.c 一、 什么是C语言位域操作(结

Ace's Blog 4091

C语言 位域的使用

目录什么是位域位域的定义位域的使用使用位域的注意点(重要)实际应用 什么是位域 有些信息在存储时,并不需要占用一个完整的字节,而只需占几个或一个二进制位。例如在存放一个开关量时,只有 0 和 1 两种状态,用 1 位二进位即可。为了节省存储空间,并使处理简便,C 语言又提供了一种数据结构,称为"位域"或"位段"。 所谓"位域"是把一个字节中的二进制位划分为几个不同的区域,并说明每个区域的位数。每个域有一个域名,允许在程序中按域名进行操作。这样就可以把几个不同的对象用一个字节的二进制位域来表示。 典型的应用场

a只如初见的博客 4660

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

使用unionint i;// 整型成员float f;// 浮点成员// 字符数组成员内存共享:所有成员共享同一段内存,联合体的大小由其最大成员决定(例如上例中约为20字节,取决于和系统对齐规则)。访问成员:使用点操作符访问联合体变量的成员,若通过指针访问则使用箭头操作符->。// 此时联合体存储的是整数// 写入浮点数,覆盖之前的整数值初始化:联合体初始化时只能初始化其第一个成员。// 正确:初始化第一个成员i// C99后允许指定初始化成员,但仍需注意覆盖。

jiaway的博客 1487

联合体(共用体) 和 位域 的使用详细解析

联合体(共用体) 和 位域 的使用详细解析

枕上青灯竹书香的博客 5672

联合体 位域结构体_联合体的妙用~

一、什么是联合体?在C语言中,变量的定义是分配存储空间的过程。一般的,每个变量都具有其独有的存储空间,那么可不可以在同一个内存空间中存储不同的数据类型(不是同事存储)呢?答案是可以的,使用联合体就可以达到这样的目的。联合体也叫共用体,在C语言中定义联合体的关键字是union。定义一个联合类型的一般形式为:union 联合名{成员表};成员表中含有若干成员,成员的一般形式为:类型说明符 成...

weixin_39740419的博客 1143

C语言 匿名联合体和匿名结构体

尤其是多层继承时,A结构体继承与B结构体、B结构体又继承C结构体…最后嵌入式开发常见的几个C编译器比如IAR MDK GCC等都是支持的匿名联合体和结构体的,如果不支持可以粘贴下面的代码到自己的系统头文件中,就可以让你的匿名代码在意思几个环境下获得支持。如上所示,如果已经通过 datagram.data 接收到数据,想要从数据中提取传感器x轴数据,则只要通过 datagram.packet.x 就可以获取x轴数据。匿名联合体和匿名结构体顾名思义,就是没有名字的联合体和结构体,没有名字哪怎么用?

u012841414的博客 2960

联合体与位段(位域)

在C语言中,变量的定义是分配存储空间的过程。一般的,每个变量都具有其独有的存储空间,那么可不可以在同一个内存空间中存储不同的数据类型(不是同时存储)呢?答案是可以的,使用联合体就可以达到这样的目的。联合体也叫共用体,在C语言中定义联合体的关键字是union。

weixin_73530513的博客 1069

Accelstepper 库中的参数计算公式

要完全调试电机的各个参数,例如最大速度,加速度等,就需要了解其计算公式和原理。 以下是代码注释: /// This code uses speed calculations as described in /// "Generate stepper-motor speed profiles in real time" by David Austin/// http://fab.cba.mi...

wenguitao的博客 4455

【C语言基础】结构体与联合体互相嵌套的使用

【代码】【C语言基础】结构体中内嵌联合体。

欢迎时常光顾我的干货超市,热衷于AIoT!! 4854

ROS2学习笔记(二)-- 多机通讯原理简介及配置方法

简单介绍ROS2多机通信原理以及配置注意事项

aibingjin的博客 1万+

PyCharm配置SSH和SFTP远程连接服务器

关于这篇博文,主要因为公司企业都是通过本地测试,同步到服务器进行跑动,舍友看着同事丝滑的操作,让我做个教程。本着钻研的精神,写下了这篇博客记录 关于pycharm这个软件,只有专业版才有远程连接的这个配置,社区版没有(同事一再强调要专业版,学生认证还可申请免费) 关于SSH和SFTP都是一种协议 具体知识点补充可看我这篇文章: 【计算机网络】常见面试题集锦(全) SSH:提供安全通道进行远程登录 SFTP协议可以远程文件传输获取等,数据的安全传输主要由SSH连接提供

码农研究僧的博客 5533

结构体 + 联合体 + 位域 使用

简单介绍结构体 定义结构体,一般是对有相同属性的元素或成员的归纳,比如电机的电气特性:驱动电压、驱动电流、运行速度;还有比如系统报警类:过压报警、过流报警、欠压报警 本人常用格式 typedef struct { u8 Volt;//成员变量 u8 Curr; u16 Speed; }Motor_InitTypeDef; 当然,还有其它的格式,可以自行查找 使用方法: Motor_InitTypeDef Motor_InitStre;//定义结构体变量 Motor_InitStr...

yuyan7045的博客 3291

STM32 之十三 看门狗(WDG)及低功耗下的处理

  最近在做低功耗项目时,遇到了看门狗不好处理的问题。在 ST 的各系列 MCU 中,看门狗应该算是使用配置起来最简单的一个外设了。我们通常仅需要配置很少的配置项,但是,一旦要配合低功耗模式则配置就比较麻烦了。MCU 中有两只狗,一只叫 Independent watchdog (IWDG);另一只叫 System window watchdog (WWDG)。下面是这两只狗的简单介绍! IWDG   IWDG 基本就等同于我们独立使用的看门狗芯片。最适合那些要求看门狗作为一个完全独立的进程在主应用程序之外

技术干货 7852

C语言结构体、联合体、位域详解

结构体、联合体、位域操作

qq_45315034的博客 1289

流体仿真软件:COMSOL Multiphysics二次开发_(11).COMSOL与外部软件的数据交换

通过上述方法,您可以实现 COMSOL Multiphysics 与外部软件的数据交换,从而更好地集成和分析仿真结果。无论是从文本文件导入数据,导出数据到 MATLAB,还是通过 API 和 COMSOL Server 实现实时通信,都能满足不同场景下的需求。希望这些内容对您在流体仿真领域的开发工作有所帮助。

kkchenjj的博客 1553

11、基于拓扑质心和树编辑距离的RNA二级结构比较方法

本文介绍了一种基于拓扑质心和树编辑距离的RNA二级结构比较方法,特别适用于处理具有假结结构的RNA。通过PEELING算法识别拓扑质心并将其转换为树结构,结合树编辑距离进行高效比较,并提供工具planeGraph2tree实现该方法。博文详细描述了方法原理、操作流程以及应用示例,展示了其在功能性非编码RNA分析中的实用性。

resnet7explorer的博客 111

C语言-结构体、联合体、枚举

c语言中的结构体、联合体、枚举的定义、语法以及应用

m0_74147998的博客 2008

动态视频目标追踪系统:基于YOLOv11+DeepSORT的从入门到实战全流程指南

仅保留车辆类别(假设车辆类别ID为2)if det.class_index == 2: # 车辆类别ID通过本指南,你已完成从环境搭建数据准备模型训练到追踪系统与UI界面的全流程,搭建了一套完整的动态视频目标追踪系统。该系统在安防监控、交通管理等场景中具有实用价值,可实现目标的实时稳定追踪。未来,你可尝试结合多模态特征(如目标外观+运动特征)提升追踪鲁棒性,或探索轻量化模型部署(如TensorRT加速),让系统在边缘设备上也能高效运行。

LXY_LOVE36的博客 142

结构体+联合体+位域的实际使用

结构体、联合体

qq_45294059的博客 2839

基于英特尔 RealSense D455 相机实现裂缝尺寸以及深度测量

D455 相机可用于对这些零部件进行高精度的表面检测,快速准确地测量裂缝的尺寸和深度,实现自动化的质量控制和缺陷筛查,提高生产效率和产品质量。D455 相机能够对焊缝表面进行细致扫描,测量焊缝的宽度、深度以及焊缝表面的不规则程度等参数,帮助检测焊缝是否存在缺陷,如未焊透、焊瘤等,为焊接质量的评估和改进提供数据支持。:RGB 传感器采用全局快门,并且其视场与深度视场相匹配,能够提供更出色的 RGB 图像质量,以及深度图像和 RGB 图像之间的更好对应性,从而可提高扫描质量。可以看出宽度和高度都是十分准确的。

qq_53545309的博客 1715

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

【C语言高级技巧】:位域与联合体对齐的5种优化策略

掌握C语言联合体的位域对齐技巧,有效优化内存布局与访问效率。适用于嵌入式开发、协议解析等场景,详解5种对齐策略及编译器行为差异,提升代码可移植性与性能表现,值得收藏。

IterStream的博客 859

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

C语言结构体与联合体的高级用法及技巧分享

结构体内存对齐:理解并优化结构体的内存对齐,可以显著提高内存的利用效率,减少浪费。合理使用联合体:利用联合体的共享内存特性,可以在需要存储不同类型数据时节省内存,尤其适用于嵌入式开发中的内存限制环境。类型选择与转换:通过合理选择数据类型、避免隐式类型转换,可以减少溢出和错误发生的概率。联合体与位域结合:结合位域与联合体,能够更精确地控制存储在内存中的数据,适合需要对数据进行按位操作的场景。嵌套结构体与联合体:在复杂的数据结构设计中,合理使用结构体与联合体的嵌套,能够使代码更加清晰、灵活。

探索技术、创意与生活的交汇点,分享个人成长与思考,带你发现生活中的美好与智慧 1364

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

C语言利用联合体和结构体位域实现位带操作

C语言利用联合体和结构体位域实现位带操作代码 C语言编程时经常需要操作特定的数据中特定的bit位,可以通过与、或操作实现。我试了一下用结构体位域和联合体,实现了可单独对bit操作。和正常变量赋值一样,即可对单独的bit位写1或写0。下面是代码和运行结果。 小白的第一篇博客,工作时遇到的问题用博客记录一下,方便以后查看。希望能坚持下去。 代码 #include "stdio.h" typedef...

cai_niao321的博客 1739

iOS位运算及联合体位域

目录1. 概述2. 位运算2.1 按位与运算2.2 按位或运算2.3 按位异或运算2.4 取反运算2.5 左移运算2.6 右移运算3. 位域3.1 位域的定义和位域变量的说明3.2 位域的使用3.3 位域总结4. 联合体5. 联合体位域 1. 概述 今天来点概念性的东西,如果在代码中用到位运算和联合体位域,是不是会显得高级一些呢?哈哈。 2. 位运算 在C语言中共提供了6中位运算符,具体如下: & 按位与 | 按位或 ^ 按位异或 ~ 取反 << 左移 >> 右移

郭永明的技术专栏 3789

联合体,位域, 结构体对齐

联合体union      当多个数据需要共享内存或者多个数据每次只取其一时,可以利用联合体(union)。在C Programming Language 一书中对于联合体是这么描述的:      1)联合体是一个结构;      2)它的所有成员相对于基地址的偏移量都为0;      3)此结构空间要大到足够容纳最"宽"的成员; 1下面解释这四条描述:      由于联合体中的所有成

lei19950206的博客 2021

C语言之我对结构体与联合体的认识

这次我们介绍了关于结构体位段、联合和枚举还有联合体的内容。希望大家可以从中学到东西。c语言中的小小白-优快云博客c语言中的小小白关注算法,c++,c语言,贪心算法,链表,mysql,动态规划,后端,线性回归,数据结构,排序算法领域.https://blog.youkuaiyun.com/bhbcdxb123?

bhbcdxb123的博客 1151
上一篇: x86架构地址空间的分类
下一篇: VisualStudio设置静态链接
彦祖学嵌入
博客等级 码龄4年 91粉丝 26原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值