您的位置:首页 > 编程语言 > C语言/C++

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

2015-02-01 16:18 351 查看
         我们知道, 在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;
}      好的, 位段到此为止, 算是有个基本认识了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: