聊聊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语言中的位段来做。
我们先来简要感知一下:
我们要注意, 一个位段必须位于同一个字节内, 不允许跨越, 所以一个位段的长度不能大于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;
} 好的, 位段到此为止, 算是有个基本认识了。
有时候, 需要用一个变量表示“开/关”状态, 说白了, 也就是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语言位段、位域及TCP报文头描述
- C语言 中结构体的位域(位段)
- 浅析C语言位域和位段
- 在C语言中各种数据类型各占多少位 C语言 中结构体的位域(位段)
- C语言变量声明加冒号的用法 称为“位域”或“位段“
- C语言变量声明加冒号的用法 称为“位域”或“位段“
- C语言结构体中位域(位段)的使用
- C语言位域(位段)
- C语言位域和位段
- C语言位域!
- C语言位域
- C语言&nbsp;结构体的内存对齐问题与位域
- 聊聊C语言的预编译指令include
- C语言中位域
- C语言位段与联合体(union)的内存分配
- C语言中位域
- C语言 结构体的内存对齐问题与位域
- c语言位域
- 【c语言】位段赋值的例子
- 位段【C语言】