无锡网站建设多少钱,做网站怎么那么难,网络营销可以做什么工作,装wordpress需要配置apache1、union#xff08;共用体#xff09;
1.1、概述
C 语言中#xff0c;union是一种数据类型#xff0c;对比于结构体#xff0c;结构体中的每个成员都占用独立的内存空间#xff0c;而联合中所有的成员都共享同一个内存空间。
也就是说#xff0c;union中的不同成员要…1、union共用体
1.1、概述
C 语言中union是一种数据类型对比于结构体结构体中的每个成员都占用独立的内存空间而联合中所有的成员都共享同一个内存空间。
也就是说union中的不同成员要表示的是同一个变量的不同数据类型。
1.2、代码
#include stdio.hunion 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 | (11);