位域结构体

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

规则:

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

举例

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

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

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; //一个字节.blog

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 <stdio.h>
struct {
    short int a:2;
    int b:4;
    char c;
    }x;
struct {
    int a:2;
    int b:4;
    char c;
    }x1;
struct {
    short s1:3;
    short s2:3;
    short s3:3;
    }x2;
struct{
    char c1:3;
    char c2:2;
    char c3:2;
    }x3;
int main(void)
{
printf("%d\n",sizeof(x));
printf("%d\n",sizeof(x1));
printf("%d\n",sizeof(x2));
printf("%d\n",sizeof(x3));
}

12
8
2
1
请按任意键继续. . .域名

相关文章
相关标签/搜索