C++Union简析

利用STM32F4 将两个u16类型的数合成一个float型 STM32 将两个u16类型的数合成一个float型 项目背景 最近在做一个项目的时候,需要通过STM32F4和FPGA进行通信,将高速AD采样得到的数据利用STM32进行运算,并发送出去。但是在编写FSMC的过程中,我只会从FPGA读写得到u16类型的数据,但我最后需要运算的数据是float型的,所以我假设负责FPGA的同学能够将数据以u16类型保存在FPGA的寄存器中,那么我读取出来之后,需要将2个U16类型的数据合并,得到一个float型。 代码 函数部分非常简单,但是需要了解union类结构体的特 阅读详情

联合(union)在C/C++里面见得并不多,但是在一些对内存要求特别严格的地方,联合又是频繁出现,那么究竟什么是联合、怎么去用、有什么需要注意的地方呢?就这些问题,我试着做一些简单的回答,里面肯定还有不当的地方,欢迎指出!


1、什么是联合?
“联合”是一种特殊的类,也是一种构造类型的数据结构。在一个“联合”内可以定义多种不同的数据类型, 一个被说明为该“联合”类型的变量中,允许装入该“联合”所定义的任何一种数据,这些数据共享同一段内存,已达到节省空间的目的(还有一个节省空间的类型:位域)。 这是一个非常特殊的地方,也是联合的特征。另外,同struct一样,联合默认访问权限也是公有的,并且,也具有成员函数。


2、联合与结构的区别?

“联合”与“结构”有一些相似之处。但两者有本质上的不同。在结构中各成员有各自的内存空间, 一个结构变量的总长度是各成员长度之和(空结构除外,同时不考虑边界调整)。而在“联合”中,各成员共享一段内存空间, 一个联合变量的长度等于各成员中最长的长度。应该说明的是, 这里所谓的共享不是指把多个成员同时装入一个联合变量内, 而是指该联合变量可被赋予任一成员值,但每次只能赋一种值, 赋入新值则冲去旧值。


#include <stdio.h>
void main()
{
	union number
	{ /*定义一个联合*/
		int i;
		struct
		{ /*在联合中定义一个结构*/
			char first;
			char second;
		}half;
	}num;
	num.i=0x4241; /*联合成员赋值*/
	printf("%c%c/n", num.half.first, num.half.second);
	num.half.first='a'; /*联合中结构成员赋值*/
	num.half.second='b';
	printf("%x/n", num.i);
	getchar();
}
输出结果为: 
AB 
6261

从上例结果可以看出: 当给i赋值后, 其低八位也就是first和second的值; 当给first和second赋字符后, 这两个字符的ASCII码也将作为i 的低八位和高八位。

3、如何定义?


例如:

union test
{
	int office;
	char teacher[5];
};
定义了一个名为test的联合类型,它含有两个成员,一个为整型,成员名office;另一个为字符数组,数组名为teacher。联合定义之后,即可进行联合变量说明,被说明为test类型的变量,可以存放整型量office或存放字符数组teacher。


4、如何说明?
联合变量的说明有三种形式:先定义再说明、定义同时说明和直接说明。


以test类型为例,说明如下:

union test
{
	int office;
	char teacher[5];
}; 
union test a,b; /*说明a,b为test类型*/

union test
{
	int office;
	char teacher[5];
} a,b;

<pre name="code" class="cpp">union 
{
	int office;
	char teacher[5];
} a,b;




说明后的a,b变量均为test类型。a,b变量的长度应等于test的成员中最长的长度,即等于teacher数组的长度,共5个字节。a,b变量如赋予整型值时,只使用了4个字节,而赋予字符数组时,可用5个字节。

 

5、如何使用?
对联合变量的赋值,使用都只能是对变量的成员进行。联合变量的成员表示为: 
联合变量名.成员名 
例如,a被说明为test类型的变量之后,可使用a.class、a.office 
不允许只用联合变量名作赋值或其它操作,也不允许对联合变量作初始化赋值,赋值只能在程序中进行。
还要再强调说明的是,一个联合变量,每次只能赋予一个成员值。换句话说,一个联合变量的值就是联合变员的某一个成员值。





【C/C++面试必备 | 基础概念】union的用法 这一篇文章来总结一下union的用法。 定义:union是一种“类似”与struct的联合体,联合的所有成员引用的是内存中的相同位置,以最大的成员的内存长度作为union的内存大小。union主要用来节省空间,默认的访问权限是公有的。 注意点: (1)同一个内存段可以用来存放几种不同类型的成员,但在每一个时刻只能存在其中一种,而不能同时存放几种,即每一瞬间只有一个成员起作用,其它的成... 阅读详情

相关推荐

C++联合体union用法实例详解

本文实例讲述了C++联合体union用法。分享给大家供大家参考。具体如下: 我们应该按照C中的convention去使用union,这是我这篇文章要给出的观点。虽然C++使得我们可以扩展一些新的东西进去,但是,我建议你不要那样去做,看完这篇文章之后,我想你大概也是这么想的。   C由于没有类的概念,所有类型其实都可以看作是基本类型的组合,因此在union中包含struct也就是一件很自然的事情了,到了C++之后,既然普遍认为C++中的struct与class基本等价,那么union中是否可以有类成员呢?先来看看如下的代码: struct TestUnion {    TestUnion()

C++中union的使用

<br />联合(union)在C/C++里面见得并不多,但是在一些对内存要求特别严格的地方,联合又是频繁出现,那么究竟什么是联合、怎么去用、有什么需要注意的地方呢?就这些问题,我试着做一些简单的回答,里面肯定还有不当的地方,欢迎指出!<br /><br />1、什么是联合?<br />“联合”是一种特殊的类,也是一种构造类型的数据结构。在一个“联合”内可以定义多种不同的数据类型, 一个被说明为该“联合”类型的变量中,允许装入该“联合”所定义的任何一种数据,这些数据共享同一段内存,已达到节省空间的目的(还有

持续前进 697

从IPv6到Tomcat:彻底解决127.0.0.1拒绝连接的完整指南

本文提供了从IPv6到Tomcat的全面指南,帮助开发者彻底解决127.0.0.1拒绝连接的问题。涵盖网络协议栈、服务配置、端口管理等多个层面的排查方法,特别针对Tomcat服务提供了专项解决方案,确保开发者能够快速定位并修复连接问题。

weixin_29207439的博客 472

共用体把高八位和低八位取出

共用体的成员是占用一个空间的,如下的定义; union union_temp16 //共用体 占用的是最长的数据类型 { U16 un_temp16; U8 untemp8[2]; } mytemp16; 占得是U16 类型的; untemp8[0]和untemp8[1]分别是un_temp16的高八位和低八位; 如定义 U16 ADD=0x1634; unsig...

#elseif 1183

硬件开发实践:高速 PCB 差分信号与时钟同步优化

由两条互补信号线组成(正负极)接收端只关注两线之间电压差共模噪声对两线同时作用,可被抵消。

2501_93174775的博客 394

二次开发vba_CATIA VBA(VBS)二次开发:使用Search批量选择元素

在CATIA二次开发中很多在程序中进行自动交互的方法或函数都需要使用选择集作为参数,将几何元素按照要求批量添加到选择集中也是实现程序自动运行的有效方法。在前面的文章《CATIA使用VBA(VBS)二次开发时用户的交互选择》和《CATIA使用VBA(VBS)二次开发时工程图和草图位置的交互选择函数Indicate2D》中介绍了在CATIA VBA(VBS)二次开发中用户和选择集之间的交互操...

weixin_32497403的博客 1321

union使用

ypedef union {     struct {         mfxU16  Minor;         mfxU16  Major;     };     mfxU32  Version; } mfxVersion;

奋斗的伙计 452

STM32F103C8T6 + GY-906红外测温:手把手教你用CubeMX和HAL库搞定IIC驱动(附完整工程)

本文详细介绍了如何使用STM32F103C8T6和GY-906红外测温传感器(基于MLX90614芯片)实现非接触式温度测量。从STM32CubeMX工程创建、HAL库驱动适配到温度数据采集与处理,提供完整的开发流程和常见问题解决方案,帮助开发者快速掌握红外测温技术。

weixin_29188043的博客 254

【Cpp】C++中的union

一、继承C语言的union C++中的共用体也是从C中继承过来的,沿用了C中的所有特性 二、C++中union的提升 C++中在定义共用体变量的时候也可以省略union关键字(类似enum),直接类型名 变量名 C++中,union的成员还可以是简单对象,但是对象不能包含自定义构造函数和析构函数 在C语言中,也可以通过函数指针实现类型的功能: union myunion { void...

baymaxly的博客 990

Unity3D 加密 Assembly-CSharp.dll (Android平台) 防止反编译

0、加密的原理 Unity3D 是基于 Mono的,我们平时写的 C# 脚本都被编译到了 Assembly-CSharp.dll ,然后 再由 Mono 来加载、解析、然后执行。 Mono 加载 Assembly-CSharp.dll 的时候就是读取文件到内存中,和平时读取一个 游戏资源 文件没什么区别。 为了防止别人破解,我们会对游戏资源加密,简单点的 比如修改文件的一个字节 或者 位移一下

Circle 8720

自动驾驶领域自动化数据标注应用

自动驾驶领域自动化数据标注应用 1. 背景介绍 1.1 自动驾驶技术的发展 自动驾驶技术近年来取得了长足的进步,吸引了众多科技公司和传统车企的投入。自动驾驶系统需要感知周围环境、做出决策并控制车辆,是一个极具挑战的任务。其中,环境感知是自

AI天才研究院 2214

C++中的union介绍

union介绍   共用体,也叫联合体,在一个“联合”内可以定义多种不同的数据类型, 一个被说明为该“联合”类型的变量中,允许装入该“联合”所定义的任何一种数据,这些数据共享同一段内存,以达到节省空间的目的。union变量所占用的内存长度等于最长的成员的内存长度。 union与struct比较 先看一个关于struct的例子: struct student { char mark; long num; float score; }; 其struct的内存结构如下

std7879的博客 1万+

云计算 | 期末梳理(上)

2024云计算回忆版 && 复盘向梳理

知识库搭建ing 2231

C++关键字之——union

C++关键字之——union

StephenRay的博客 5841

GJB 5000B二级-II实施基础

本文主要描述GJB 5000B二级II实施基础与GJB 5000A的变化情况,以及过程域各条款的实施要点

Abel的博客 2581

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

C++ union共用体的使用方法

C++ union共用体的使用方法定义互斥赋值sizeof( )转载链接 定义 union即为联合,它是一种特殊的类。通过关键字union进行定义,一个union可以有多个数据成员。例如: union Token{ char cval; int ival; double dval; }; 以上代码定义了一个名为Token的联合,该联合中包含了3个数据成员。 互斥赋值 在任意时刻...

皮皮#2500 3569

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

c++中union的使用

union即为联合,它是一种特殊的类。通过关键字union进行定义,一个union可以有多个数据成员。 在任意时刻,联合中只能有一个数据成员可以有值。当给联合中某个成员赋值之后,该联合中的其它成员就变成未定义状态了。 在C/C++程序的编写中,当多个基本数据类型或复合数据结构要占用同一片内存时,我们要使用联合体;当多种类型,多个对象,多个事物只取其一时(我们姑且通俗地称其为“n 选1”),我们也可以使用联合体来发挥其长处。 union主要是共享内存,分配内存以其最大的结构或对象为大小,即sizeof最大的。

qq_45611002的博客 1万+

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

C++ struct 与 union

C++是一种强类型语言。C++程序中的任何变量(或函数)必须遵循“先说明后使用”的原则。定义数据类型有两个方面的作用:一是决定该类型的数据在内存中如何存储,而是决定可对该类型的数据进行哪些合法的运算。...

Doublelv 的博客专栏。 5780

C++之union详解

union的介绍

m0_72542983的博客 4315

C语言 C++中的union用法总结(包懂)

开始的话 已经好长时间没有更新了,对不起自己,更对不起我亲爱的读者,同时也对不起自己开办的这个博客平台。忙,太忙了,忙于找工作,找一份好工作,纠结于去大城市闯呢,还是回到本省的首府城市。大家都在纠结这个问题,也希望大家和我讨论讨论。别的先不说了,都工作这么长时间了,还回过头来总结union,确实有点过分,要是和大家说我一直从事于C++开发,还不懂union,大家可能还真的不信。我们每天都在总结那些看似高端的东西,什么设计模式(当然我也有总结了)、重构...

梁同学与Android 1万+

C++中union的应用剖析

C++中union的应用剖析作者:袁小凯华南理工大学计算机研究所北区研发二部Email – ccplusplus@21cn.com前言       熟悉C的程序员都知道union(联合体)的用法,利用union可以用相同的存储空间存储不同型别的数据类型,从而节省内存空间。当访问其内成员时可用”.”和”->”来直接访问。在C++出现后,它继承了union并保留了其在C中的特性。但

winmain的专栏 1522

《 C++ 点滴漫谈: 十二 》让内存飞一会儿:C++ Union 的神奇魔法

C++ 中的 union 关键字是一种独特的内存共享机制,通过允许多个成员共享同一段内存,提供了高效的存储方式和灵活的操作手段。本博客深入探讨了 union 的基础概念、成员规则、构造函数与析构函数的使用,以及现代 C++ 提供的新特性支持。同时,我们分析了 union 的典型应用场景,如低级内存操作与数据转换,并对其常见误区与陷阱进行详解,帮助读者避免潜在风险。此外,文章还将 union 与现代 C++ 特性进行对比,揭示替代方案的优劣势,助力开发者在实际项目中做出最佳选择。通过这篇博客,您将全面掌握 u

Lenyiin 2445

C++ 关键字 union

联合(union)是一种特殊类,其所有成员共享同一内存空间,仅能存储一个成员的值。特点包括:默认public权限、可含构造/析构函数、禁止引用成员/继承/虚函数。匿名union可直接访问成员但受限(如全局匿名union需static)。与struct类似,union仅按最大成员分配内存(如含double则占8字节),所有成员起始地址相同。典型应用如StateMachine联合体可存储不同类型数据但同一时刻仅能使用一种。通过共享内存实现空间优化,适用于类型互斥的场景。

人无远虑,必有近忧 1034

如何用C++ union 来 实现一个 C# object

C#的 object 相信用过的人都能体会出它的优点, 可以  实现 任意类型的boxed,unboxed , 如下  int n = 10;   object o = n;    int m = (int) o;   在类型的传递中可以起到一个自适配的容器, 这种写法 在接口的统一 上  能起到很好的作用 , 比如你不知道如何传递一个未知类型的参数时 , 你可以在接口处定义 object 参数让

DDR的专栏 1865

union c语言什么意思,C语言、C++中的union用法总结(包懂)

开始的话已经好长时间没有更新了,对不起自己,更对不起我亲爱的读者,同时也对不起自己开办的这个博客平台。忙,太忙了,忙于找工作,找一份好工作,纠结于去大城市闯呢,还是回到本省的首府城市。大家都在纠结这个问题,也希望大家和我讨论讨论。别的先不说了,都工作这么长时间了,还回过头来总结union,确实有点过分,要是和大家说我一直从事于C++开发,还不懂union,大家可能还真的不信。我们每天都在总结那些看...

weixin_33426866的博客 3805

c++ --> union介绍

union介绍   共用体,也叫联合体,在一个“联合”内可以定义多种不同的数据类型, 一个被说明为该“联合”类型的变量中,允许装入该“联合”所定义的任何一种数据,这些数据共享同一段内存,以达到节省空间的目的。union变量所占用的内存长度等于最长的成员的内存长度。 union与struct比较 先看一个关于struct的例子: struct student { ch...

weixin_30387663的博客 1356
上一篇: C语言文件操作解析(一)
下一篇: win7+cygwin+hadoop亲测成功
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值