文章内容包含:
1、位域
2、联合体
1. 位域
信息在存储时,有时并不需要占用一个完整的字节,而只需占几个或一个二进制位。例如一个Bool值,存 0 和 1 两种状态,用一个二进制位即可,这种存储方式称为位域。
- 定义
struct YFStruct {
// a: 位域名 1:位域长度(单位 bit位)
char a : 1; //占用 1 个bit位
char b : 1; //占用 1 个bit位
char c : 1; //占用 1 个bit位
char d : 1; //占用 1 个bit位
}yfStruct;
//占用字节数:1
文字定义:
一个位域必须存储在同一个字节内,不能跨两个字节。如一个字节所剩空间不够存放另一位域时,则新增一字节进行存储。
由于位域不允许跨两个字节,所以一个位域的长度不能大于 8 个bit位。
位域可以无位域名,这时它只用来作填充或调整位置。无名位域是不可使用。
struct YFStruct {
char a : 6;
char b : 5;
char c : 2;
char d : 4;
}yfStruct;
//占用 3 个字节
struct YFStruct {
char a : 6;
char : 0; //无名位域,占用该字节剩余空间,后面数据则存入下一字节中
char c : 2;
char d : 4;
}yfStruct;
//占用 3 个字节
2. 联合体
联合体:
共用同一块内存空间,必须可以容纳最大的成员变量,通过可容纳最大的成员变量(基本数据类型)计算出来的大小必须是其的整数倍
union YFUnion{
char *a; //8字节
int b; //4字节
int c; //4字节
}u1
//u1 占用的内存空间就是 8 个字节
u1.a = "联合体";
u1.b = 4;
u1.c = 5;
结果输出:u1中三个元素使用的是
同一块地址,地址所存储的内容则是最后一个赋值元素的值,a = "" 则是类型与最后赋值的元素类型不一致
结构体中存储的元素可以在存储空间
共存,各个成员会占用不同的内存,互相之间没有影响
联合体中存储的元素在存储空间中占用同一段内存,修改一个成员会影响剩下的所有成员