位域結構體

位結構是一種特殊的結構, 在需按位訪問一個字節或字的多個位時, 位結構比按位運算符更加方便。數組

規則:

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
請按任意鍵繼續. . .域名

相關文章
相關標籤/搜索