【C语言】详解位域定义与使用

位域的定义

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 


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 


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,不要混合使用,这样才能达到节省内存空间的目的。

你可能感兴趣的:(C语言,c语言)