位域结构体

位结构是一种特殊的结构, 在需按位访问一个字节或字的多个位时, 位结构比按位运算符更加方便。
规则:

  1. 位结构中的成员可以定义为unsigned, 也可定义为signed或者是char, 但当成员长度为1时, 会被认为是unsigned类型。因为单个位不可能具有符号。
  2. 位结构中的成员不能使用数组和指针, 但位结构变量可以是数组和指针, 如果是指针, 其成员访问方式同结构指针。
  3. 位结构总长度(位数), 是各个位成员定义的位数之和(如果类型相同的话)
  4. 位结构成员可以与其它结构成员一起使用。
    a:由于位域不允许跨两个字节,因此位域的长度不能大于一个字节的长度,也就是说不能超过8位二进位。
    b:位域可以无位域名,这时它只用来作填充或调整位置。无名的位域是不能使用的。
    c:如果相邻位域字段的类型相同,且其位宽之和小于类型的sizeof大小,则后面的字段将紧邻前一个字段存储,直到不能容纳为止。

举例:
要注意位定义是:先定义的存储低位,后定义存储高位,不足在高位加0补齐

我们再来看看下面两个结构体定义:
1
struct foo2 {
char a : 2;
char b : 3;
char c : 1;
};

struct foo3 {
char a : 2;
char b : 3;
char c : 7;
};
我们来打印一下这两个结构体的大小,我们得到的结果是:
sizeof(struct foo2) = 1
sizeof(struct foo3) = 2
2
struct
{
unsigned short s1:3; //一个字节.

unsigned short s2:3; //一个字节
unsigned short s3:3; //一个字节
}x;
sizeof(x)
为9位(相邻类型相同可以共用)而最终结果为了内存对齐(对齐为2的倍数).取为2.
3
struct {
int a:2;
int b:4;
char c;
}x;
int main(void)
{
printf(“%d”,sizeof(x));//8
}

#include <iostream>

struct test1
{
    int a ;
    int b ;
};
struct test2
{
    char a ;
    char b ;
};
struct test3
{
    int a :1;
    int b :1;
};
int main(){
    std::cout << "test len:" << std::endl;
    test1 t1;
    size_t len = sizeof(t1);
    std::cout << "len:" << len << std::endl;
    test2 t2;
    len = sizeof(t2);
    std::cout << "len:" << len << std::endl;
    test3 t3;
    len = sizeof(t3);
    std::cout << "len:" << len << std::endl;

    return 0;
}

结果:

test len:
len:8
len:2
len:4

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值