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

联合体(Union)

联合体(Union)简介

联合体(union)是 C 和 C++ 编程语言中的一种数据结构,和结构体(struct)类似,但有一些重要的区别。

定义
  • 联合体中的所有成员共享同一段内存,也就是说,联合体中的多个成员变量会占用相同的地址,但是在任何一个时间点只能存储一个成员的值。

1. 联合体的定义和语法

定义语法
union UnionName {DataType member1;DataType member2;...
};
示例
union Example {int i;       // 整数,占用 4 字节float f;     // 浮点数,占用 4 字节char c;      // 字符,占用 1 字节
};
  • 这里的联合体 Example 包含了 3 个成员:
    • 一个整数 i,占用 4 字节。
    • 一个浮点数 f,占用 4 字节。
    • 一个字符 c,占用 1 字节。
  • 存储特点
    • 联合体的总大小取决于它的最大成员所需的内存大小(这里是 4 字节,因为 intfloat 都占 4 字节)。

2. 联合体的内存分配

内存共享特点
  • 联合体中的所有成员都共享同一块内存,因此:
    • 写入一个成员会覆盖其他成员的值。
    • 在任意时刻,联合体中只能存储一个有效值。
示例
union Example {int i;       // 整数,占用 4 字节float f;     // 浮点数,占用 4 字节char c[4];   // 字符数组,占用 4 字节
};
union Example ex;
ex.i = 42;      // 写入整数 42
printf("i: %d\n", ex.i);    // 输出 i 的值:42
ex.f = 3.14;    // 写入浮点数 3.14
printf("f: %.2f\n", ex.f);  // 输出 f 的值:3.14
printf("i: %d\n", ex.i);    // 输出 i 的值:此时 i 的值已被覆盖
输出
i: 42
f: 3.14
i: 1078523331   // i 的值被 f 的写入覆盖,解释为浮点数的二进制形式

3. 联合体的用途

3.1 内存节省
  • 联合体非常适合需要节省内存的场景。
  • 由于多个成员共享同一段内存,可以显著减少内存占用。
3.2 数据转换
  • 联合体常用于类型转换,允许以不同的方式访问同一块数据。
示例:浮点数与二进制表示的转换
#include <stdio.h>
union FloatToBits {float f;unsigned int bits;
};
int main() {union FloatToBits data;data.f = 3.14;   // 写入浮点数printf("Float: %.2f\n", data.f);          // 输出浮点数printf("Bits: 0x%X\n", data.bits);        // 输出二进制表示return 0;
}
输出
Float: 3.14
Bits: 0x4048F5C3
  • 同一块内存可以通过 data.f 访问为浮点数,通过 data.bits 访问为其二进制位。

4. 联合体的常见用途

4.1 数据协议处理
  • 联合体常用于解析二进制数据流。例如,在通讯协议中,可以通过联合体将字节流解析为特定的数据结构。
示例:解析 16 位数据的高低字节
union Data16 {unsigned short full;  // 16 位数据struct {unsigned char low;  // 低字节unsigned char high; // 高字节} parts;
};
int main() {union Data16 data;data.full = 0x1234; // 写入 16 位数据printf("Full: 0x%X\n", data.full);      // 输出完整值printf("High: 0x%X\n", data.parts.high); // 输出高字节printf("Low: 0x%X\n", data.parts.low);   // 输出低字节return 0;
}
输出
Full: 0x1234
High: 0x12
Low: 0x34
应用场景
  • 网络协议
    • 在网络通讯中,经常需要解析协议头部,例如 IP 包头、TCP 包头等,联合体可以方便地拆解字段。
  • 嵌入式开发
    • 在嵌入式系统中,用联合体将字节序列解析为多字节变量(如 intfloat)。

4.2 硬件寄存器操作
  • 联合体可以用于操作硬件寄存器,通过联合体直接访问寄存器的特定位。
示例:32 位寄存器的分段访问
union Register {unsigned int value;  // 寄存器的完整值struct {unsigned char byte0;  // 第 0 字节unsigned char byte1;  // 第 1 字节unsigned char byte2;  // 第 2 字节unsigned char byte3;  // 第 3 字节} bytes;
};
int main() {union Register reg;reg.value = 0x12345678; // 写入寄存器值printf("Byte 0: 0x%X\n", reg.bytes.byte0); // 输出低字节printf("Byte 1: 0x%X\n", reg.bytes.byte1); // 输出次低字节printf("Byte 2: 0x%X\n", reg.bytes.byte2); // 输出次高字节printf("Byte 3: 0x%X\n", reg.bytes.byte3); // 输出高字节return 0;
}
输出
Byte 0: 0x78
Byte 1: 0x56
Byte 2: 0x34
Byte 3: 0x12

5. 联合体与结构体的区别

特性联合体(union)结构体(struct)
内存分配所有成员共享同一段内存,大小由最大成员决定每个成员都有独立的内存,大小是所有成员内存之和
成员访问同一时刻只能存储一个成员,访问其他成员可能导致数据不一致所有成员可以同时访问,互不干扰
用途内存节省,数据转换,多种数据形式的联合表示表示多种属性的组合体
使用限制不适合需要同时使用多个成员的场景可以同时访问多个成员

6. 注意事项

  1. 数据覆盖
    • 由于所有成员共享内存,当你写入一个成员时,会覆盖其他成员的值。
    • 使用联合体时要非常小心,确保对成员的访问逻辑正确。
  2. 对齐与大小
    • 联合体的大小由其最大成员的大小决定,并可能受到编译器对齐(padding)的影响。
  3. 联合体与类型安全
    • 联合体没有类型检查机制,读写不同类型的成员时可能导致不安全行为。

7. 总结

  • 联合体是 C/C++ 中的一种高级数据类型,适用于节省内存、数据解析和类型转换等场景。
  • 其核心特点是成员共享同一段内存,这既带来了灵活性,也对程序员提出了更高的使用要求。
  • 常见用途包括:
    1. 数据协议解析(如解析高低字节)。
    2. 硬件寄存器操作
    3. 浮点数与二进制位的转换
    4. 节省内存空间的场景

如有侵权,联系删除

相关文章:

联合体(Union)

联合体&#xff08;Union&#xff09;简介 联合体&#xff08;union&#xff09;是 C 和 C 编程语言中的一种数据结构&#xff0c;和结构体&#xff08;struct&#xff09;类似&#xff0c;但有一些重要的区别。 定义 联合体中的所有成员共享同一段内存&#xff0c;也就是说…...

Kibana:ES|QL 编辑器简介

作者&#xff1a;来自 Elastic drewdaemon ES|QL 很重要 &#x1f4aa; 正如你可能已经听说的那样&#xff0c;ES|QL 是 Elastic 的新查询语言。我们对 ES|QL 寄予厚望。它已经很出色了&#xff0c;但随着时间的推移&#xff0c;它将成为与 Elasticsearch 中的数据交互的最强大…...

【工具】curl工具

curl 官网&#xff1a; https://curl.se/ github: https://github.com/curl?languagec curl 命令 所有参数介绍在线文档 简单使用教程 邮件发送命令 注&#xff1a; 支持SMTP&#xff08;或者POP3&#xff09;协议&#xff0c;curl的版本必须高于7.20&#xff08;含&…...

idea中远程调试中配置的参数说明

Ⅰ 远程调试中配置的端口号与服务本身端口号区别 一、远程调试中配置端口号的作用 在 IDEA 中进行远程调试时配置的端口号主要用于建立开发工具&#xff08;如 IDEA&#xff09;和远程服务之间的调试连接。当你启动远程调试时&#xff0c;IDEA 会监听这个配置的端口号&#xf…...

JavaWeb 前端基础 html + CSS 快速入门 | 018

今日推荐语 指望别人的救赎&#xff0c;势必走向毁灭——波伏娃 日期 学习内容 打卡编号2025年01月17日JavaWeb 前端基础 html CSS018 前言 哈喽&#xff0c;我是菜鸟阿康。 今天 正式进入JavaWeb 的学习&#xff0c;简单学习 html CSS 这2各前端基础部分&am…...

Debian 设定 tomcat 定时重启

目录 背景 过程记录 1、编辑sh文件&#xff0c;完成重启功能 2、设置sh的可执行权限 ​编辑 3、设置定时任务 背景 在Debian 12系统中&#xff0c;原本部署了两个tomcat&#xff0c;结果总是遇到CPU飙升到影响应用正常使用的程度&#xff0c;找了很久原因还是没有找到。 …...

【QT】: 初识 QWidget 控件 | QWidget 核心属性(API) | qrc 文件

&#x1f525; 目录 1. 控件概述 控件体系的发展阶段 2. QWidget 核心属性 2.1 核心属性概览2.2 用件可用&#xff08;Enabled&#xff09; 2.3 坐标系&#xff08;Geometry&#xff09; **实例 1: 控制按钮的位置**实例 2: 表白 程序 2.4 窗口标题&#xff08;windowTiltle&a…...

下载文件,浏览器阻止不安全下载

背景&#xff1a; 在项目开发中&#xff0c;遇到需要下载文件的情况&#xff0c;文件类型可能是图片、excell表、pdf、zip等文件类型&#xff0c;但浏览器会阻止不安全的下载链接。 效果展示&#xff1a; 下载文件的两种方式&#xff1a; 一、根据接口的相对url&#xff0c;拼…...

基于javaweb的SpringBoot景区旅游管理系统设计和实现(源码+文档+部署讲解)

个人名片 &#x1f525; 源码获取 | 毕设定制| 商务合作&#xff1a;《个人名片》 ⛺️心若有所向往,何惧道阻且长 文章目录 个人名片运行环境技术栈适用功能说明使用说明 运行环境 Java≥8、MySQL≥5.7 1.运行环境&#xff1a;最好是java jdk 1.8&#xff0c;我们在这个平台…...

【17】Word:林楚楠-供应链❗

目录 题目 NO1.2 NO3 NO4 NO5 NO6 NO7 NO89 题目 NO1.2 另存为&#xff1a;文件→另存为→文档→文件名/考生文件夹F12/FnF12→文件名/考生文件夹 插入→分节符→文本框→输入文件→排版_居中对齐→间距/回车去掉文本框的边框→选中文本框→格式&#xff1a;形状轮廓…...

Transformer中基于惊喜的遗忘机制

在语言建模任务上,拥有 760M 参数的 Titans(MAC) 在 WikiText 上达到了 19.93 的困惑度,显著优于同等规模的 Transformer++(25.21) 和 Mamba2(22.94)。在常识推理任务上,Titans 在包括 PIQA、HellaSwag、WinoGrande 等 9 个基准测试中的平均准确率达到 52.51%,超过了现…...

从玩具到工业控制--51单片机的跨界传奇【3】

在科技的浩瀚宇宙中&#xff0c;51 单片机就像一颗独特的星辰&#xff0c;散发着神秘而迷人的光芒。对于无数电子爱好者而言&#xff0c;点亮 51 单片机上的第一颗 LED 灯&#xff0c;不仅仅是一次简单的操作&#xff0c;更像是开启了一扇通往新世界的大门。这小小的 LED 灯&am…...

基于机器学习的用户健康风险分类及预测分析

完整源码项目包获取→点击文章末尾名片&#xff01; 背景描述 在这个日益注重健康与体能的时代&#xff0c;健身已成为许多人追求健康生活的重要组成部分。 本数据集包含若干健身房会员的详细信息&#xff0c;包括年龄、性别、体重、身高、心率、锻炼类型、身体脂肪比例等多项关…...

CF 641A.Little Artem and Grasshopper(Java实现)

题目分析 蚂蚱会在n个房间中根据既定房间规则向固定方向跳跃固定长度&#xff0c;试问是否能够跳出这个长度&#xff08;即落点位置在0或n1&#xff09; 思路分析 输入n就有n个房间&#xff0c;n套规则&#xff08;固定方向和跳跃距离&#xff09;&#xff0c;蚂蚱到哪个房间就…...

5 分钟复刻你的声音,一键实现 GPT-Sovits 模型部署

想象一下&#xff0c;只需简单几步操作&#xff0c;就能生成逼真的语音效果&#xff0c;无论是为客户服务还是为游戏角色配音&#xff0c;都能轻松实现。GPT-Sovits 模型&#xff0c;其高效的语音生成能力为实现自然、流畅的语音交互提供了强有力的技术支持。本文将详细介绍如何…...

1.Spring AI 从入门到实践

​Spring AI 从入门到实践 1.什么是Spring AI 2.使用Spring Boot&Spring AI快速构建AI应用程序 3.ChatClient&Chat Model简化与AI模型的交互 4.Spring AI Prompt:与大模型进行有效沟通 5.结构化输出大模型响应 6.实战:AI聊天机器人 Ben技术站关注Java技术&#x…...

第23篇 基于ARM A9处理器用汇编语言实现中断<五>

Q&#xff1a;怎样修改HPS Timer 0定时器产生的中断周期&#xff1f; A&#xff1a;在上一期实验的基础上&#xff0c;可以修改按键中断服务程序&#xff0c;实现红色LED上的计数值递增的速率&#xff0c;主程序和其余代码文件不用修改。 实现以下功能&#xff1a;按下KEY0…...

攻防世界 unseping

开启场景 整体来说是创建了一个case类&#xff0c;然后可接受post传来的ctf的值&#xff0c;并对其进行base64解码以及反序列化。所以我们能控制ctf变量。 先看__wakeup方法&#xff0c;该方法使用waf方法对$arg中的内容进行了防护&#xff0c;过滤掉了| & ; 空格 / cat f…...

Python编程与在线医疗平台数据挖掘与数据应用交互性研究

一、引言 1.1 研究背景与意义 在互联网技术飞速发展的当下,在线医疗平台如雨后春笋般涌现,为人们的就医方式带来了重大变革。这些平台打破了传统医疗服务在时间和空间上的限制,使患者能够更加便捷地获取医疗资源。据相关报告显示,中国基于互联网的医疗保健行业已进入新的…...

浔川 AI 翻译已修复,可正常使用

浔川 AI 翻译已修复&#xff0c;可正常使用 亲爱的用户们&#xff1a; 大家好&#xff01;经过技术团队的不懈努力&#xff0c;浔川 AI 翻译平台已完成修复&#xff0c;目前各项功能均已恢复正常&#xff0c;可流畅使用。在此&#xff0c;我们向一直以来关心和支持浔川 AI 翻译…...

Honey Select 2终极增强补丁:3分钟快速配置完整模组生态

Honey Select 2终极增强补丁&#xff1a;3分钟快速配置完整模组生态 【免费下载链接】HS2-HF_Patch Automatically translate, uncensor and update HoneySelect2! 项目地址: https://gitcode.com/gh_mirrors/hs/HS2-HF_Patch 你是否曾为《Honey Select 2》的模组安装繁…...

2026最权威的降重复率工具解析与推荐

Ai论文网站排名&#xff08;开题报告、文献综述、降aigc率、降重综合对比&#xff09; TOP1. 千笔AI TOP2. aipasspaper TOP3. 清北论文 TOP4. 豆包 TOP5. kimi TOP6. deepseek 知网AI检测系统会去对文本的语义连贯性展开多维分析&#xff0c;会对文本的句式结构进行多维…...

W25Q64 进阶应用:从电路设计到高效存储管理的实战解析

1. W25Q64硬件电路设计实战 第一次用W25Q64做项目时&#xff0c;我在电路设计上踩过不少坑。记得有个设备频繁出现数据丢失&#xff0c;最后发现是电源滤波没做好。这个8MB容量的SPI Flash芯片虽然引脚不多&#xff0c;但每个脚的设计细节都直接影响系统稳定性。 1.1 关键引脚…...

忍者像素绘卷微信小程序集成指南:轻量API调用与像素输出适配

忍者像素绘卷微信小程序集成指南&#xff1a;轻量API调用与像素输出适配 1. 项目概述与核心价值 忍者像素绘卷是一款基于Z-Image-Turbo深度优化的图像生成工具&#xff0c;专为16-Bit复古游戏美学风格设计。它通过轻量级API服务&#xff0c;让开发者能够快速将像素艺术生成能…...

用Arduino Uno和纸板DIY一个超静音扫地机器人(附完整代码和接线图)

用Arduino Uno和纸板DIY一个超静音扫地机器人&#xff08;附完整代码和接线图&#xff09; 在宿舍或小公寓里&#xff0c;市售扫地机器人的马达噪音常常让人头疼。特别是对于学生和创客群体来说&#xff0c;既需要保持环境整洁&#xff0c;又不希望打扰到室友或邻居的休息。今天…...

PasteMD免配置环境:Docker镜像封装,3条命令完成私有化AI格式化服务部署

PasteMD免配置环境&#xff1a;Docker镜像封装&#xff0c;3条命令完成私有化AI格式化服务部署 1. 项目简介&#xff1a;剪贴板智能美化工具 PasteMD是一个完全私有化的AI文本格式化工具&#xff0c;它基于Ollama本地大模型运行框架和强大的llama3:8b模型构建。这个工具的核心…...

AI论文生成平台推荐:7款高效工具(含爱毕业aibiye)支持论文格式自动排版与LaTeX模板智能匹配

工具快速对比排名&#xff08;前7推荐&#xff09; 工具名称 核心功能亮点 处理时间 适配平台 aibiye 学生/编辑双模式降AIGC 1分钟 知网、万方等 aicheck AI痕迹精准弱化查重一体 ~20分钟 知网、格子达、维普 askpaper AIGC率个位数优化 ~20分钟 高校检测规则通…...

科大奥锐虚拟仿真实验避坑指南:从85分到95分,我的密度测量实验复盘与代码优化

科大奥锐虚拟仿真实验提分实战&#xff1a;从85分到95分的密度测量实验深度优化 第一次接触科大奥锐的密度测量虚拟仿真实验时&#xff0c;我和大多数同学一样&#xff0c;以为按照指导手册操作就能轻松拿高分。直到连续三次实验分数卡在85-87分之间&#xff0c;才意识到这个看…...

千问3.5-2B在物流场景:运单图片自动识别+收发件信息结构化

千问3.5-2B在物流场景&#xff1a;运单图片自动识别收发件信息结构化 1. 物流行业的痛点与机遇 每天&#xff0c;物流企业需要处理数以百万计的运单信息录入工作。传统的人工录入方式存在三个明显问题&#xff1a; 效率低下&#xff1a;一个熟练的录入员每小时最多处理50-80…...

Qwen3.5-9B镜像免配置实战:Docker化迁移与端口映射最佳实践

Qwen3.5-9B镜像免配置实战&#xff1a;Docker化迁移与端口映射最佳实践 1. 项目概述 Qwen3.5-9B是一个拥有90亿参数的开源大语言模型&#xff0c;具备强大的逻辑推理、代码生成和多轮对话能力。该模型支持多模态理解&#xff08;图文输入&#xff09;和长上下文处理&#xff…...