位域(位段):
有時我們存儲信息時並不需要用到一個完整的字節,而只需要幾個二進制位。C語言提供了一種數據結構,稱為位域(位段)用於這種情況。
位域(位段)的定義:
struct name{類型名 位域名:位域長度; // 位域長度不能大於8(即一個字節)
};
注意:
一個位域必須存儲在同一個字節中,當有兩個連續的位域,在一個字節中存放第一個位域后剩下的空間不足以存放第二個位域,則第二個位域將存放在一個新的字節中,前一個字節多余的未補0
struct bits{ int a:4; // 第一個字節 int b:5; // 第二個字節 };
我們也可以顯式使得某個位域存放在一個新的字節中,即使用空域
struct bits{ int a:4; // 第一個字節 int :0; // 空域 int b:2; // 第二個字節 };
當一個位域無位域名時,它只是用來作為填充或調整位置,不能被使用(int :4 僅僅是用來占4位)
位域結構的長度:
// 以下測試在Dev-cpp環境下完成的
// len = sizeof(bits) struct bits{ }; // len = 1 struct bits{ char ch; }; // len = 1 struct bits{ char a:2; }; // len = 1 struct bits{ char a:2; char b:2; }; // len = 1 struct bits{ char a:2; char b:2; char c:4; }; // len = 1 struct bits{ char a:2; char b:2; char c:4; char d:4; }; struct bits{ int n; }; // len = 4 struct bits{ int a:4; }; // len = 4 struct bits{ int a:4; int b:4; }; // len = 4 struct bits{ char a:8; int i:4; }; // len = 4 struct bits{ char a:8; char b:8; int i:4; }; // len = 4 struct bits{ char a:8; char b:8; char c:8; char d:8; int i:4; }; // len = 8
結論:
1.位域(位段)結構的大小既取決於結構內部所有位域的總大小,也取決於該位域聲明時的類型
2.當一個位域結構內部所有位域總大小小於該結構中位域聲明時的類型中長度最大的類型長度
時,該結構大小為該類型長度 (此處用用大小和長度區分自定義結構和C語言內置類型)
3.位域結構的大小總為該結構中存在的所有的位域在聲明時所用的內置類型中長度最大的內置
類型的長度的整數倍(如上述示例中的最后一個 len = 8)