c语言联合union的使用用途

在使用联合的使用,我们通常用来判断大小端,但是其实不仅仅有这个用处。

我在网上看到还有其他的用途:

1、分离高低字节

这个需要结合cpu大小端来判断,原文如下:

这样的操作,而一个除法消耗四个机器周期,取余也需要进行一系列复杂的运算,如果在短时间内需要进行很多次这样的运算无疑会给程序带来巨大的负担。

其实进行这些操作的时候我们需要的仅仅是高低字节的数据分离而已,这样利用联合体我们很容易降低这部分开销。

联合体内数据是按地址对齐的。具体是高位数据还是低位数据要看平台的大小端模式,51是大端,stm32默认是小端,如果其他编译器还请自测。

仅仅用了一条减法指令就达到了除法、取余的操作,在进行高频率定时时尤为有用。

2、寄存器封装

看看TI固件库中寄存器是怎么封装的:

所有的寄存器被封装成联合体类型的变量,联合体里边的成员是一个32bit的整数及一个结构体,该结构体以位域的形式体现。这样就可以达到直接操控寄存器的某些位了。

比如,我们要设置PA0引脚的GPAQSEL1寄存器的[1:0]两位都为1,则我们只操控两个bit就可以很方便的这么设置:

GpioCtrlRegs.GPAQSEL1.bit.GPIO0 = 3

或者直接操控整个寄存器:

GpioCtrlRegs.GPAQSEL1.all |=0x03 

以上就是关于联合体的一点总结笔记

原文地址:https://www.cnblogs.com/CodeWorkerLiMing/p/12045166.html

时间: 2024-10-13 00:11:32

c语言联合union的使用用途的相关文章

结构体struct 与 联合union

1.C语言中的结构体 1.1 定义 结构体是由一系列相同或不同类型的变量组成的集合. struct 结构体名{               //struct为关键字,“结构体名”为用户定义的类型标识. 数据类型1 成员名1;          //{ }中是组成该结构体的成员,其中数据类型可以是C语言所允许的任何数据类型. 数据类型2 成员名2; ... 数据类型n 成员名n; }; 1.2 结构体的内存分配(方法一) 结构体在内存中分配一块连续的内存,但结构体内的变量并不一定是连续存放的,这涉

SQL SERVER 2012 第四章 连接 JOIN语句的早期语法结构 & 联合UNION

1/内部连接的早期语法结构 INNER JOIN SELECT * FROM Person.Person JOIN HumanResources.Employee ON Person.Person.ID = HumanResources.Employee.ID 等价于早期的也就是老版本的 SELECT * FROM Person.Person,HumanResources.Employee WHERE Person.Person.ID = HumanResources.Employee.ID 2

C语言学习015:联合(union)与枚举(enum)

联合 联合和结构的区别是,结构会为每个字段申请一片内存空间,而联合只是申请了一片内存空间然后所有字段都会保存到这片空间中,这片空间的大小由字段中最长的决定,下面我们就开始定义一个联合 1 //联合的定义 2 typedef union{ 3 short count; 4 float weight; 5 float volume; 6 } quantity; 联合的使用 我们可以通过很多的方式为联合赋值 1 typedef struct{ 2 const char* color; 3 quanti

C语言-枚举(enum)和联合(union)

使用enum进行定义 /* 枚举类型演示 */ #include <stdio.h> int main() { enum /*季节*/ {CHUN, XIA = 5, QIU, DONG}; printf("QIU是%d\n", QIU); } 使用union联合进行定义 /* 联合演示 */ #include <stdio.h> typedef union{ int val; float fval1; } tmp; int main(){ tmp utmp =

联合----union

定义: union 是用户定义的类型,其中所有成员都共享同一个内存位置. 这意味着在任何给定时间,联合都不能包含来自其成员列表的多个对象. 这还意味着无论联合具有多少成员,它始终仅使用足以存储最大成员的内存. 即联合只保存最后写入的那个成员.赋入新值则冲去旧值. 所以一定要小心,因为这是由你负责确保:始终访问的是写入的最后一个成员. 联合不能存储引用. 联合不支持继承,因此联合本身不能用作基类.继承自另一个类或具有虚函数. 联合可以有成员函数. 好处: 具有大量对象和/或内存有限时,联合可用于节

c语言:union,大小端

union: 不允许只用联合变量名作赋值或其它操作. 也不允许对联合变量作初始化赋值,赋值只能在程序中进行. 小端存储: 以字节为单位,低存低,高存高. 任何数据在内存中都是以二进制(1或着0)顺序存储的,每一个1或着0被称为1位,而在x86CPU上一个字节是8位.比如一个16位(2字节)的 short int型变量的值是1156,那么它的二进制表达就是:00000100 10000100.由于Intel CPU的架构是Little Endian(小端存储,请参数机算机原理相关知识),所以它是按

C++-结构体(struct),联合(union),枚举(enum)

使用struct定义结构体,使用Teacher t = {"", "", ""} 进行初始化操作 /* 结构体 */ #include <iostream> using namespace std; struct Teacher{ char name[20]; int age; double salary; void who(void) { cout << "名字是" << name <

R语言函数union、setdiff、insect

union 求两个向量的并集 集合可以是任何数值类型 union(x=1:3, y=2:5) [1] 1 2 3 4 5 union(x=c("abc", "12"), y=c("bcd", "efg")) [1] "abc" "12" "bcd" "efg" setdiff 求向量x与向量y中不同的元素(只取x中不同的元素) setdiff(x,

关于夸语言联合开发接口的经验(非技术,提交工作效率)

为了实现Excel走审批流程的功能,我部门用JAVA语言写了工作流引擎,线下部门用VB扩展了EXCEL的功能,能够调用我们提供的webService走工作流程. 涉及到了三个部门的协作,线上业务开发部门java传参数给线下开发Excel控件vb部门,然后vb传调用webservcie传参数给我们平台部门走工作流. 开发过程中不可避免的会进行接口的修改,由于部门之间配合不可能那么理想,所以经常发生参数传错,找错的很多浪费工时的不必要的问题. 我总结出的参数传法,就是业务部门把所有vb部门和我这边需