位域
1.什么是位域
有些数据在存储时并不需要占用一个完整的字节,只需要占用一个或几个二进制位即可。例如单片机开发中的开关只有通电和断电两种状态,用 0 和 1 表示足以,也就是用一个二进位。正是基于节省内存空间的考虑,C语言提供了一种叫做位域的数据结构。举个例子:
struct bs{
unsigned m;
unsigned n: 4;
unsigned char ch: 6;
};
:
后面的数字用来限定成员变量占用的位数。成员 m 没有限制,根据数据类型即可推算出它占用 4 个字节(Byte)的内存。成员 n、ch 被:后面的数字限制,不能再根据数据类型计算长度,它们分别占用 4、6 位(Bit)的内存。
C语言标准规定,位域的宽度不能超过它所依附的数据类型的长度。通俗地讲,成员变量都是有类型的,这个类型限制了成员变量的最大长度,:后面的数字不能超过这个长度。
例如上面的 bs,n 的类型是 unsigned int,长度为 4 个字节,共计 32 位,那么 n 后面的数字就不能超过 32;ch 的类型是 unsigned char,长度为 1 个字节,共计 8 位,那么 ch 后面的数字就不能超过 8。
C语言标准还规定,只有有限的几种数据类型可以用于位域。在 ANSI C 中,这几种数据类型是 int、signed int 和 unsigned int(int 默认就是 signed int);到了 C99,_Bool 也被支持了。
2.问题
- 位域具体应该怎么使用。
- 使用了位域的结构体的大小是多少字节怎么计算。