位域
在某种特定情况下,一个结构体中的多个变量只使用各自存储空间的几位,而其他位从来不使用。这种情况下,可以使用位域来限定每个变量的用来存储数据的位宽。
作用
- 限定结构体中变量用来存放数据的位宽,即使用多少位来存储变量
注意
使用位域的结构体所占的内存空间为结构体中占用内存空间最多的结构体变量所占用的内存空间大小,如:有long和int,最终结构所占的内存空间为long类型所占用的内存空间(8字节)
#include <stdio.h>
struct {
unsigned int intVariable1 : 1;
unsigned int intVariable2 : 1;
} intStruct;
struct {
unsigned long longVariable : 1;
unsigned int intVariable : 1;
} longStruct;
int main(int argc, const char * argv[]) {
printf("%zd\n", sizeof(intStruct)); // 结果为:4
printf("%zd\n", sizeof(longStruct)); // 结果为:8
return 0;
}
使用位域限制的结构体变量,不可以存储超过限定位宽所能表示的最大范围的变量,否则多余的高位将截断
// 使用上述的结构体
int main(int argc, const char * argv[]) {
intStruct.intVariable1 = 0;
printf("%d\n", intStruct.intVariable1);
intStruct.intVariable1 = 1;
printf("%d\n", intStruct.intVariable1);
// 下一行会发出警告:Implicit truncation from 'int' to bitfield changes value from 2 to 0
intStruct.intVariable1 = 3;
printf("%d\n", intStruct.intVariable1);
return 0;
}
共用体
共用体是一种数据类型,实现在相同的位置存储不同的数据类型,但是在某一时刻只能保存一种数据。
定义方式
union [union tag]
{
member definition;
member definition;
...
member definition;
} [one or more union variables];
注意
- 共用体所占的内存空间大小为共用体中占用内存空间最多的共用体变量所占的内存空间大小。
- 公用通常应用于几个互斥的变量上