位結構是一種特殊的結構, 在需按位訪問一個字節或字的多個位時, 位結構比按位運算符更加方便。數組
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
請按任意鍵繼續. . .域名