【C语言】结构体篇-位域

时间:2025-03-12 08:03:36

位域允许在一个结构体中以位为单位来指定成员所占的存储空间,用于节省内存。

#include <stdio.h>

struct Flags {
    unsigned int flag1 : 1;  // 占 1 位
    unsigned int flag2 : 1;  // 占 1 位
    unsigned int flag3 : 1;  // 占 1 位
    unsigned int flag4 : 1;  // 占 1 位
};

int main() {
    struct Flags f;
    f.flag1 = 1;
    f.flag2 = 0;
    f.flag3 = 1;
    f.flag4 = 0;

    printf("Flag1: %d\n", f.flag1);
    printf("Flag2: %d\n", f.flag2);
    printf("Flag3: %d\n", f.flag3);
    printf("Flag4: %d\n", f.flag4);

    return 0;
}

在这个例子中,struct Flags 的四个成员 flag1、flag2、flag3 和 flag4 各占 1 位,总共只占 1 个字节的存储空间。

注意事项和细节

  • 位域的类型:位域的类型必须是 int、unsigned int 或 signed int,有些编译器也支持 char 类型。
  • 位域的宽度:位域的宽度不能超过其类型的大小,例如 unsigned int 类型的位域宽度不能超过 32 位。
  • 位域的可移植性:位域的实现可能因编译器和平台而异,因此位域的使用可能会影响代码的可移植性。
  • 未命名位域:可以使用未命名的位域来填充字节,以达到特定的对齐要求。
struct Example {
    unsigned int flag1 : 1;
    unsigned int : 3;  // 未命名位域,占 3 位
    unsigned int flag2 : 1;
};