OC_位域、联合体

149 阅读2分钟

文章内容包含:

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;

image.png

结果输出:u1中三个元素使用的是同一块地址,地址所存储的内容则是最后一个赋值元素的值,a = "" 则是类型与最后赋值的元素类型不一致

结构体中存储的元素可以在存储空间共存,各个成员会占用不同的内存,互相之间没有影响
联合体中存储的元素在存储空间中占用同一段内存,修改一个成员会影响剩下的所有成员