【备战春招】第5天 嵌入式工程师学习笔记
课程信息
- 课程名称:物联网/嵌入式工程师
- 章节名称:第3周之第二讲 1-12 C语言中的位域2
- 讲师姓名:大白老师
课程内容概述
1. 简介
本节介绍了位域:有些信息在存储时,并不需要占用一个完整的字节,而只需占几个或一个二进制位。例如在存放一个开关量时,只有 0 和 1 两种状态,用 1 位二进位即可。为了节省存储空间,并使处理简便,C 语言又提供了一种数据结构,称为"位域"或"位段"。
2. 空域
2.1 说明
一个位域存储在同一个字节中,如一个字节所剩空间不够存放另一位域时,则会从下一单元起存放该位域。也可以有意使某位域从下一单元开始。
2.2 使用方法
struct info
{
unsigned char a:4;
unsigned char :4; /* 空域 */
unsigned char b:4; /* 从下一单元开始存放 */
unsigned char c:4
};
3. 无名位域
3.1 说明
- 位域的宽度不能超过它所依附的数据类型的长度,成员变量都是有类型的,这个类型限制了成员变量的最大长度,后面的数字不能超过这个长度。
- 位域可以是无名位域,这时它只用来作填充或调整位置。无名的位域是不能使用的。
3.2 使用方法
struct info
{
int a:1;
int :2; /* 该 2 位不能使用 */
int b:3;
int c:2;
}st;
4. 位域大小的计算
4.1 说明
- 如果相邻的两个位域字段的类型相同,且其位宽之和小于或等于其类型的sizeof()大小,则其后面的位域字段将紧邻前一个字段存储,直到不能容纳为止;
例如:一个位域变量有三个位域字段a、b、c,且类型完全相同,位域字段a和b的位宽之和小于或等于其类型的sizeof()大小,那么位域字段c紧接着位域字段b后面存储;
4.2 使用方法
#include <stdio.h>
struct bit
{
unsigned int a: 6;
unsigned int b: 12;
unsigned int c: 4;
}bt;
int main( )
{
// 求sizeof(bt)的大小。
printf("sizeof(bt):%d\n", sizeof(bt));
return 0;
}
运行结果
sizeof(bt):4
学习心得
C语言中的位域,在节省空间、使用位进行相关处理时用处很大。