聊聊C语言中的位段(位域)

         我们知道, 在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;
}
      好的, 位段到此为止, 算是有个基本认识了。


你可能感兴趣的:(聊聊C语言中的位段(位域))