当前位置: 首页 > news >正文

union和位域的混合使用

1、union(共用体)

1.1、概述

C 语言中,union是一种数据类型,对比于结构体,结构体中的每个成员都占用独立的内存空间,而联合中所有的成员都共享同一个内存空间

也就是说,union中的不同成员要表示的是同一个变量的不同数据类型。

1.2、代码

#include <stdio.h>union data{int n;char ch;short m;
};int main(){union data a;printf("%d, %d\n", sizeof(a), sizeof(union data) );a.n = 0x40;printf("%X, %c, %hX\n", a.n, a.ch, a.m);a.ch = '9';printf("%X, %c, %hX\n", a.n, a.ch, a.m);a.m = 0x2059;printf("%X, %c, %hX\n", a.n, a.ch, a.m);a.n = 0x3E25AD54;printf("%X, %c, %hX\n", a.n, a.ch, a.m);return 0;
}

 

 注意:

1、union的存储空间以最大的成员为准,成员定义中最大的是int n,所以为4个字节。

2、图中的ch,n,m共用了4字节的内存空间。(根据大小端不同,存放顺序会不一致)

3、修改其中的一个成员,会覆盖原有数据,而造成其他成员的变化。


2、位域

2.1、概述

在定义结构体时,我们可以指定某个成员变量所占用的二进制位数(Bit)。

  • 成员变量的类型限制最大的二进制位数。
  • “:”后指定该成员变量所占用的二进制位数。

2.2、代码

struct bit_field {unsigned int a : 1;unsigned int b : 2;unsigned int c : 5;
};

这个结构体有三个成员变量 a、b 和 c,它们分别占用 1 位、2 位、5 位二进制位。

2.3、特殊说明

  • 位域成员变量的访问速度并不一定比一般的成员变量快,因为有些编译器不支持单个位域的直接操作,需要先将整个位域读入CPU寄存器中,然后进行各种“位运算”操作。

  • 对于位域成员变量,不能取地址运算符(&)对其进行取址操作,因为它们并不按字节对齐,取址操作会得到一个编译错误。


3、混合使用的代码及解释

union 
{u16 wDevSta ;struct{unsigned char bRegister:1;unsigned char bONLine:1;unsigned char bReConnect:1;unsigned char bLowBAT:1;unsigned char bConfig:1;unsigned char b5:1;unsigned char b6:1;unsigned char b7:1;unsigned char b8:1;unsigned char b9:1;unsigned char b10:1;unsigned char b11:1;unsigned char b12:1;unsigned char b13:1;unsigned char b14:1;unsigned char b15:1;} ch;
}g_DevStatus;

定义了一个union类型的变量g_DevStatus,包含了一个u16 wDevSta和一个嵌套的结构体成员ch。

在结构体成员ch中,有16个位域变量,每个位域变量都只占用1位,分别用来表示设备的不同状态,取值为0或1。

例如,如果要将设备的bONLine状态设置为1,可以使用以下2种代码:

g_DevStatus.ch.bONLine = 1;
g_DevStatus.wDevSta |= (1<<1);

相关文章:

union和位域的混合使用

1、union&#xff08;共用体&#xff09; 1.1、概述 C 语言中&#xff0c;union是一种数据类型&#xff0c;对比于结构体&#xff0c;结构体中的每个成员都占用独立的内存空间&#xff0c;而联合中所有的成员都共享同一个内存空间。 也就是说&#xff0c;union中的不同成员要…...

PMP 高项 07-项目质量管理

项目质量管理 概念 质量的基本概念 克劳斯比&#xff1a;符合要求 戴明&#xff1a;低成本条件下可预测的一致性和可靠度&#xff0c;适应市场需要 朱兰&#xff1a;适用性&#xff0c;满足客户需要 国际标准化组织&#xff1a;质量是反映实体&#xff08;产品、过程或活动等…...

鸿蒙Hi3861学习十一-Huawei LiteOS-M(内存池)

一、简介 LiteOS将内核与内存管理分开实现&#xff0c;操作系统内核仅规定了必要的内存管理函数原型&#xff0c;而不关心这些内存管理函数是如何实现的。 LiteOS内存管理模块管理系统的内存资源&#xff0c;包括&#xff1a;初始化、分配、释放。 不采用C标准库中的内存管理函…...

MySQL原理(七):内存管理和磁盘管理

前言 上一篇介绍了 MySQL 的日志&#xff0c;这一篇将介绍内存管理和磁盘管理相关的内容。 内存管理 MySQL 的数据都是存在磁盘中的&#xff0c;我们要更新一条记录的时候&#xff0c;得先要从磁盘读取该记录&#xff0c;然后在内存中修改这条记录。修改完这条记录后会缓存起…...

【Shell脚本】Linux安装Nginx以及开机自启

目录 一、Linux安装Nginx脚本1、把编写好的安装Nginx脚本放置到nginx.sh文件中2、在检查网络的时候&#xff0c;这里的IP地址&#xff0c;填写的需要安装Nginx服务器的IP地址3、这里的端口号可按照自己的需要进行修改4、安装Nginx脚本 二、Nginx开机自启 一、Linux安装Nginx脚本…...

solidworks三维建模竞赛练习题

solidworks三维建模竞赛练习题&#xff1a;3D01‐ 01 solidworks三维建模竞赛练习题&#xff1a;3D01‐ 02 solidworks三维建模竞赛练习题&#xff1a;3D01‐ 03 solidworks三维建模竞赛练习题&#xff1a;3D01‐ 04 solidworks三维建模竞赛练习题&#xff1a;3D01‐ 05 solidw…...

Redis---订阅和发布

目录 消息系统命令 消息系统 ​ 发布/订阅&#xff0c;即 pub/sub&#xff0c;是一种消息通信模式&#xff1a;发布者也称为消息生产者&#xff0c;生产和发送消息到存储系统&#xff1b;订阅者也称为消息消费者&#xff0c;从存储系统接收和消费消息。这个存储系统可以是文件系…...

使用Statsmodel进行假设检验和线性回归

如果你使用 Python 处理数据&#xff0c;你可能听说过 statsmodel 库。Statsmodels 是一个 Python 模块&#xff0c;它提供各种统计模型和函数来探索、分析和可视化数据。该库广泛用于学术研究、金融和数据科学。在本文中&#xff0c;我们将介绍 statsmodel 库的基础知识、如何…...

mac电脑 安装homebrew、nvm、node、nrm

安装homebrew /bin/zsh -c "$(curl -fsSL https://gitee.com/cunkai/HomebrewCN/raw/master/Homebrew.sh)brew -v 查看版本号 根据提示。继续执行 不然之后安装nvm报错&#xff08;Error: Command failed with exit 128: git&#xff09;&#xff1b;例子&#xff1a; g…...

chrome 113 因为策略原因 cookie显示非常隐蔽

难受的要死&#xff0c;找不到cookie&#xff0c;安装老版本还疯狂偷跑我代理的流量更新&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01; 解决方案&#xff1a; 回退112 &#xff01;&#xff01;&#xff01;&#xff01;&#xff0…...

Python3 operator 模块

Python3 中的 operator 模块提供了一系列用于操作 Python 内置类型的函数&#xff0c;这些函数可以替代常规的操作符&#xff0c;同时也提供了一些额外的功能。下面是 operator 模块中的一些常用函数及其作用&#xff1a; 1. operator.add(a, b)&#xff1a;返回 a 和 b 的和&…...

106.(cesium篇)cesium椎体旋转

听老人家说:多看美女会长寿 地图之家总目录(订阅之前建议先查看该博客) 文章末尾处提供保证可运行完整代码包,运行如有问题,可“私信”博主。 效果如下所示: 下面献上完整代码,代码重要位置会做相应解释 <html lang="en"> <...

springboot+vue漫画之家系统(源码+文档)

风定落花生&#xff0c;歌声逐流水&#xff0c;大家好我是风歌&#xff0c;混迹在java圈的辛苦码农。今天要和大家聊的是一款基于springboot的漫画之家系统。项目源码以及部署相关请联系风歌&#xff0c;文末附上联系信息 。 &#x1f495;&#x1f495;作者&#xff1a;风歌&a…...

什么是中国版软件能力成熟度之CSMM

当前&#xff0c;中国软件产业蓬勃发展&#xff0c;产业增速迅猛&#xff0c;发展韧性和潜力进一步凸显。由于我国长期缺乏相关的自主标准&#xff0c;20多年来国外标准在我国软件评估领域占据主导地位&#xff0c;不仅阻碍了我国自主产业发展&#xff0c;甚至通过评估等手段可…...

Jupyter Notebook环境如何搭建以及应用呢?

Jupyter Notebook 是一个开源的 Web 应用程序&#xff0c;可以创建和共享文学化程序文档&#xff0c;支持多种编程语言&#xff0c;如 Python、R、Julia等。下面是搭建 Jupyter Notebook 环境及应用的步骤&#xff1a; 安装 Python 首先需要在本地安装 Python。可以从 Python…...

vmware15+ubuntu+AS

一、VMware Workstation 与 Device/Credential Guard 不兼容 安装VMware15后&#xff0c;在运行启动ubuntu时一直提示与Device/Credential Guard不兼容 1、WINR打开运行&#xff0c;输入services.msc&#xff1b; 2、服务中找 HV主机服务&#xff0c;双击打开设置改为禁用&am…...

【软考备战·希赛网每日一练】2023年5月10日

文章目录 一、今日成绩二、错题总结第一题第二题第三题 三、知识查缺 题目及解析来源&#xff1a;2023年05月10日软件设计师每日一练 一、今日成绩 二、错题总结 第一题 解析&#xff1a; proceed v.开始行动&#xff0c;开展&#xff1b;继续做&#xff08;或从事、进行&…...

涉及红外的数据集

来源 红外和可见光的联合任务相关数据集 - 知乎 LLVIP Dataset(RGB-T Pedestrian Detection) Jia X, Zhu C, Li M, et al. LLVIP: A visible-infrared paired dataset for low-light vision[C]//Proceedings of the IEEE/CVF International Conference on Computer Vision. 2…...

网络编程(TCP与UDP协议)

文章目录 1. 网络编程1.1 软件架构1.2 网络基础 2. 网络通信要素2.1 如何实现网络中的主机互相通信2.2 通信要素一&#xff1a;IP地址和域名2.2.1 IP地址2.2.2 域名 2.3 通信要素二&#xff1a;端口号2.4 通信要素三&#xff1a;网络通信协议 3. 传输层协议&#xff1a;TCP与UD…...

专业恢复电脑数据软件Easyrecovery16

Easyrecovery是一款强大的数据恢复软件&#xff0c;它专门解决磁盘数据恢复问题。在计算机世界里&#xff0c;数据丢失经常是一件令人头疼的事情&#xff0c;但是有了Easyrecovery&#xff0c;您可以放心大胆地享受数据备份和恢复的乐趣。 Easyrecovery具有快速和有效的数据恢复…...

Java报表中AIX字体丢失的解决方案

在使用Java报表开发时&#xff0c;有时候会遇到AIX字体丢失的问题。这种问题通常发生在AIX操作系统上&#xff0c;因为Java报表应用程序通常运行在Windows操作系统上。但是&#xff0c;在某些情况下&#xff0c;AIX操作系统上的Java应用程序也可能会遇到AIX字体丢失的问题。 AI…...

postgresql数据库linux centos7 安装

简介 &#xff08;百度百科&#xff09; PostgreSQL是一种特性非常齐全的自由软件的对象-关系型数据库管理系统&#xff08;ORDBMS&#xff09;&#xff0c;是以加州大学计算机系开发的POSTGRES&#xff0c;4.2版本为基础的对象关系型数据库管理系统。POSTGRES的许多领先概念只…...

IDEA配置Maven教程(超详细版~)

文章目录 前言一、Maven下载二、配置Maven环境变量三、settings.xml配置文件修改四、打开IDEA配置Maven 前言 本文介绍在IDEA中配置Maven 一、Maven下载 首先我们进入maven官方网站&#xff0c;进入网页后&#xff0c;点击Download去下载 下载免安装版&#xff0c;解压即可,…...

springMvc自定义参数校验器及基础使用

文章目录 学习链接基础使用1.单个参数校验全局异常处理器 2.实体类参数校验3.嵌套校验4.分组校验5.自定义校验注解 自定义参数校验器springmvc参数校验使用方法自定义错误消息模板观察源码自定义错误消息创建ValidationMessages.properties 在Controller中使用 自定义参数校验器…...

Java基础之ConcurrentHashMap答非所问

ConcurrentHashMap的数据结构是什么&#xff1f; ConcurrentHashMap仅仅是HashMap的线程安全版本&#xff0c;针对HashMap的线程安全优化&#xff0c;所以HashMap有的特点ConcurrentHashMap同意具有&#xff0c; ConcurrentHashMap的数据结构跟HashMap是一样的。 在JDK7版本使用…...

「锂」清思绪,触达未来 | 锂电池企业如何实现数字化破局?

锂电池制造的困局与破局 锂电池行业产业链的上游主要为正负极材料、电解液、电极基材、隔膜等领域的供应商&#xff1b;中游为电芯制造及封装行业&#xff1b;下游则主要是动力电池、消费电子等锂电池的应用领域。 图1&#xff1a;锂电池行业产业链 近年来&#xff0c;随着相…...

量化散户交易数据:追涨爆亏99%,杀跌少赚28倍?| 追涨杀跌一时爽,散户钱包火葬场?【邢不行】

你第一次炒股的经历是不是这样的&#xff1a; 你有一个朋友&#xff0c;他说在XX股票上大赚了一笔&#xff0c;你听后是既羡慕又不服。 于是你下载了炒股软件&#xff0c;看了眼这只股票&#xff0c;有点心动。但由于没有交易经验&#xff0c;股价又确实涨了不少&#xff0c;…...

Eclipse字体大小设置的5个步骤

Eclipse是一款非常流行的Java集成开发环境(IDE)&#xff0c;它被广泛地用于开发Java应用程序。在Eclipse中&#xff0c;字体大小对于用户体验至关重要。因此&#xff0c;了解如何在Eclipse中设置字体大小是非常有用的。 1、打开Eclipse 首先&#xff0c;打开Eclipse IDE。如果E…...

qt creator添加build步骤删除某个文件

参考&#xff1a;https://blog.csdn.net/weixin_44436546/article/details/113587115 1. windows下配置&#xff1a; 添加build步骤&#xff1b;在commad栏输入cmd,会弹出C:\Windows\system32\cmd.exe&#xff1b;在Arguments栏输入/c release\upgrade.o&#xff1b;Working …...

四. AMS源码分析

AMS 主要负责四大组件的启动、切换和调度以及应用程序的管理和调度工作. ActivityManager的组成主要分为以下几个部分: 服务代理: 由ActivityManagerProxy实现,用于与Server端提供的系统服务进行进程间通信服务中枢: ActivityManagerNative,继承自Binder并实现了IActivityMana…...