位域的定义
struct bit
{
unsigned char b1 : 1;//位宽度为1
unsigned char b2 : 3;//位宽度为3
unsigned char b3 : 3;
unsigned char b4 : 1;
};
struct bit
{
unsigned int b1 : 1;//位宽度为1
unsigned int b2 : 4;//位宽度为4
unsigned int b3 : 4;
unsigned int b4 : 2;
};
带有空域的定义
struct bit
{
unsigned int b1 : 1;//位宽度为1
unsigned int : 3;//空域 位宽度为3
unsigned int b3 : 4;
unsigned int b4 : 2;
};
对于位域的定义尚有以下几点说明:
- 一个位域存储在同一个字节中,如一个字节所剩空间不够存放另一位域时,则会从下一单元起存放该位域。也可以有意使某位域从下一单元开始。
struct Bit1
{
unsigned short B1 : 1;//位宽度位1
unsigned short B2 : 3;
unsigned short B3 : 3;
unsigned short B4 : 4;
};
struct Bit2
{
unsigned short B1 : 1;//位宽度位1
unsigned short : 5;//空域
unsigned short B3 : 3;
unsigned short B4 : 4;
};
struct Bit2
{
unsigned short B1 : 1;//位宽度位1
unsigned short : 5;//空域
unsigned short B2 : 1;
unsigned short : 3;//空域
unsigned short B3 : 4;
};
-
位域的宽度不能超过它所依附的数据类型的长度,成员变量都是有类型的,这个类型限制了成员变量的最大长度,
:
后面的数字不能超过这个长度。char
为8位,short
为16位,int
为32位。 -
位域可以是无名位域,这时它只用来作填充或调整位置。无名的位域是不能使用的。
指针类型的位域
#include <stdio.h>
struct Bit
{
unsigned short B1 : 1;//位宽度位1
unsigned short B2 : 3;
unsigned short B3 : 3;
unsigned short B4 : 4;
};
int main()
{
struct Bit bit;
struct Bit *pBit;
pBit = &bit;
bit.B1 = 1;
bit.B3 = 4;
printf("B1 = %u\n", pBit->B1);
printf("B3 = %u\n", pBit->B3);
}
其实和结构体指针用法一样。
使用位域的时候,要注意不要超过位的宽度,超过的部分会被截断。
位域与共用体一起使用
位域与共用体结合使用非常适合寄存器的读写。
#include <stdio.h>
typedef struct
{
unsigned short b1 : 1;
unsigned short b2 : 3;
unsigned short : 4;
unsigned short b3 : 4;
}Bit_t;
typedef union
{
unsigned short _2byte;
unsigned char byte;
Bit_t bit;
}U_t;
int main()
{
U_t *pu;
pu = (U_t*)0x12345678;//假设寄存器的地址为0x12345678;
pu->_2byte = 0xF0C;//以2个字节的方式写入数据到寄存器
printf("b1 = %u\n", pu->bit.b1);//读出数据
printf("b2 = %u\n", pu->bit.b2);
printf("b3 = %u\n", pu->bit.b3);
}
建议
定义位域时,各个成员的类型最好保持一致,比如都用char,或都用int,不要混合使用,这样才能达到节省内存空间的目的。