【嵌入式C语言】共用体Union的使用指南

1.什么是共用体

共用体有时也被称为联合或者联合体,这也是 Union 这个单词的本意。

结构体和共用体的区别在于:结构体的各个成员会占用不同的内存,互相之间没有影响;而共用体的所有成员占用同一段内存,修改一个成员会影响其余所有成员。

2.共用体与结构体的存储

typedef struct 
{
	char A;
	char B;
	char C;
	char D;
}ST;

typedef union
{
	char A;
	char B;
	char C;
	char D;
}UN;

同样的定义结构体和共用体,但是在内存中的存储是不同的。
在这里插入图片描述

简单来说,如果把结构体中的数据想象成每一个内存块的名字,那么共用体就是一个内存块有多个名字。

上面我们讨论的是共同体和结构体内部存储数据大小一致的情况,当存储的数据大小不一致时,共同体和结构体内部的数据是怎么存储的呢?

** 结构体占用的内存大于等于所有成员占用的内存的总和(成员之间可能会存在缝隙),共用体占用的内存等于最长的成员占用的内存。** 共用体使用了内存覆盖技术,同一时刻只能保存一个成员的值,如果对新的成员赋值,就会把原来成员的值覆盖掉。

摘几句The C Programming Language里面讲述这个问题的原话,以说明读书还是必要的:
① 联合就是一个结构,
② 它的所有成员相对于基地址的偏移量都为0,
③ 此结构空间要大到足够容纳最“宽”的成员,
④ 并且,其对齐方式要适合于联合中所有类型的成员。

在这里插入图片描述

3.实际使用中的技巧

在实际的C语言编程中,我们使用共同体最常见的方式,是用共用体来管理传输中的位数据,也就是bit类型数据。
举个例子 :我们定义一个数据格式,其中最高位的bit代表传输方向,次高位的bit代表是否有后续帧,其余的bit三三一组代表数据发送与接收的计数器,那么数据结构如下

在这里插入图片描述
在这个结构中,我们可以将其定义为结构体形式也可以定义为共用体形式,由于共用体它的所有成员相对于基地址的偏移量都为0,而一个unsigned char 类型的数据存储的基地址是0bit 所占有的位置。

typedef struct 
{
	unsigned char RRR:3;
	unsigned char TTT:3;
	unsigned char FRAM:1;
	unsigned char DIR:1;
}CONTROL;

typedef union
{
	typedef struct 
	{
		unsigned char RRR:3; //数据存储最低位
		unsigned char TTT:3;
		unsigned char FRAM:1;
		unsigned char DIR:1; //数据最高位
	}DATA;
	unsigned char ALL;	
}CONTROL;

对比上面两者的定义,均可以实现数据的准确存储,内存占用也完全一致,但是在数据的管理方面,后者要比前者更具有优势,在存时,可以直接将需要赋值的数据赋给ALL数据,在DATA内部就可以取出相应位的数据值,清空也很方便。

第一种定义方式也可以通过指针和长度来实现这种操作,但是直接操作存在一定的风险,此处不做讨论。

都看到这里了,如果有帮助,点个赞👍👍👍再走呗!
点个赞,代码没有Bug呦~

  • 3
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
sscanf函数是C语言中一个非常常用的函数,它可以将一个字符串按照指定的格式转换成相应的数据类型。在嵌入式开发中,sscanf函数也是非常常见的,因为很多时候需要从串口或者其他外部设备中读取数据,并将其转换成相应的数据类型进行处理。下面是一些sscanf函数的使用技巧: 1. 使用sscanf函数时一定要注意格式字符串的正确性。格式字符串中的占位符必须与待转换的数据类型相对应,否则会发生未知错误。 2. 如果待转换的字符串中包含多个数据,可以使用多个占位符进行转换。例如,如果待转换的字符串为"1,2,3",可以使用" %d,%d,%d"的格式字符串进行转换。 3. 可以使用sscanf函数的返回值来判断转换是否成功。如果返回值等于待转换字符串的长度,则说明转换成功,否则转换失败。 4. 如果待转换的字符串中包含浮点数,可以使用"%f"或者"%lf"的格式字符串进行转换。 5. 如果待转换的字符串中包含十六进制数,可以使用"%x"的格式字符串进行转换。 6. 如果待转换的字符串中包含字符或字符串,可以使用"%c"或者"%s"的格式字符串进行转换。 7. 如果待转换的字符串中包含指针类型的数据,可以使用"%p"的格式字符串进行转换。 总之,在使用sscanf函数时一定要注意格式字符串的正确性,否则很容易出现转换错误的情况。同时,还应该注意sscanf函数返回值的判断,以确保转换的正确性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

铭秋

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值