位域的定义
struct bit
{
unsigned char b1 : 1;
unsigned char b2 : 3;
unsigned char b3 : 3;
unsigned char b4 : 1;
};
struct bit
{
unsigned int b1 : 1;
unsigned int b2 : 4;
unsigned int b3 : 4;
unsigned int b4 : 2;
};
带有空域的定义
struct bit
{
unsigned int b1 : 1;
unsigned int : 3;
unsigned int b3 : 4;
unsigned int b4 : 2;
};
对于位域的定义尚有以下几点说明:
- 一个位域存储在同一个字节中,如一个字节所剩空间不够存放另一位域时,则会从下一单元起存放该位域。也可以有意使某位域从下一单元开始。
struct Bit1
{
unsigned short B1 : 1;
unsigned short B2 : 3;
unsigned short B3 : 3;
unsigned short B4 : 4;
};
struct Bit2
{
unsigned short B1 : 1;
unsigned short : 5;
unsigned short B3 : 3;
unsigned short B4 : 4;
};
struct Bit2
{
unsigned short B1 : 1;
unsigned short : 5;
unsigned short B2 : 1;
unsigned short : 3;
unsigned short B3 : 4;
};
指针类型的位域
#include <stdio.h>
struct Bit
{
unsigned short B1 : 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;
pu->_2byte = 0xF0C;
printf("b1 = %u\n", pu->bit.b1);
printf("b2 = %u\n", pu->bit.b2);
printf("b3 = %u\n", pu->bit.b3);
}
建议
定义位域时,各个成员的类型最好保持一致,比如都用char,或都用int,不要混合使用,这样才能达到节省内存空间的目的。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)