我们知道, 在C中, char占据8的位, 你可以这么理解: 一个厕所有8个坑位, 刚好组成一个char. 在32位机器上, 一个int占领32个坑位, 一眼望去, 就是32个坑, 何其壮观。 如果有人蹲在其中, 表示1, 如果没有人蹲在其中, 表示0.
有时候, 需要用一个变量表示“开/关”状态, 说白了, 也就是0和1. 如果用int, 那其余的31个坑位不是被浪费了么? 即使是用char, 那也会浪费另外的7个坑位。 此时, 我们可以用C语言中的位段来做。
我们先来简要感知一下:
#include<stdio.h>
int main()
{
struct test1
{
unsigned int a : 1;
unsigned int b : 2;
unsigned int c : 1;
}t1;
t1.a = 0;
t1.b = 1;
t1.c = 0;
printf("%u, %u, %u\n", t1.a, t1.b, t1.c);
return 0;
}
我们要注意, 一个位段必须位于同一个字节内, 不允许跨越, 所以一个位段的长度不能大于8位, 否则可能截断, 如下:
#include<stdio.h>
int main()
{
struct test1
{
unsigned int a : 1;
unsigned int b : 2;
unsigned int c : 1;
}t1;
t1.a = 4; // ...0100, 取最后1位, 所以是0
t1.b = 5; // ...0101, 取最后2位, 所以是1
t1.c = 6; // ...0110, 取最后1位, 所以是0
printf("%u, %u, %u\n", t1.a, t1.b, t1.c); // 0, 1, 0
t1.a = 9; // ...1001, 取最后1位, 所以是1
t1.b = 10; // ...1010, 取最后2位, 所以是2
t1.c = 11; // ...1011, 取最后1位, 所以是1
printf("%u, %u, %u\n", t1.a, t1.b, t1.c); // 1, 2, 1
return 0;
}
好的, 位段到此为止, 算是有个基本认识了。