11、位段
?
位段以位為單位定義結構體(或共用體)中成員所占存儲空間的長度。含有位段的結構體類型稱為位段結構。?位段成員必須被聲明為unsigned或int類型。
位段結構也是一種結構體類型,只不過其中含有以位為單位定義存儲長度的整數類型位段成員。采用位段結構既節省存儲空間,又可方便操作。?
位段結構中位段的定義格式為:?
?? unsigned <成員名>:<二進制位數>?
例如:?
struct bytedata?
{unsigned a:2;?? /*位段a,占2位*/
unsigned:6;? /*無名位段,占6位,但不能訪問*/
unsigned:0;???? /*無名位段,占0位,表下一位段從下一字邊界開始*/
unsigned b:10;? /*位段b,占10位*/
int i;????????? /*成員i,從下一字邊界開始*/
}data;
位段數據的引用:
同結構體成員中的數據引用一樣,但應注意位段的最大取值范圍不要超出二進制位數定的范圍,否則超出部分會丟棄。
例如:data.a=2;?? 但? data.a=10;就超出范圍(a占2位,最大3)
?
關于位段數據,注意以下幾點:
?
(1)一個位段必須存儲在同一存儲單元(即字)之中,不能跨兩個單元。如果其單元空間不夠,則剩余空間不用,從下一個單元起存放該位段。
(2)可以通過定義長度為0的位段的方式使下一位段從下一存儲單元開始。
(3)可以定義無名位段。
(4)位段的長度不能大于存儲單元的長度。也不能定義位段數組。
(5)位段無地址,不能對位段進行取地址運算。
(6)位段可以以%d,%o,%x格式輸出。
(7)位段若出現在表達式中,將被系統自動轉換成整數。
將struct和union類型結合使用,即發揮了指針運算的高效,又保護了原始數據不被破壞。具體實現方法如下:
typedef union??? /*8位位段分解類型*/
{char value;
struct
{unsigned b0:1;
unsigned b1:1;
unsigned b2:1;
unsigned b3:1;
unsigned b4:1;
unsigned b5:1;
unsigned b6:1;
unsigned b7:1;
}bits;
}
bits8;
這樣,用該結構來保存數據,即可以用.value來保存和訪問數據,又可以用.b0、.b1...來訪問第1、2...等位,非常方便。
位段
位段以位為單位定義結構體(或共用體)中成員所占存儲空間的長度。含有位段的結構體類型稱為位段結構。
位段結構也是一種結構體類型,只不過其中含有以位為單位定義存儲長度的整數類型位段成員。采用位段結構既節省存儲空間,又可方便操作。
位段結構中位段的定義格式為:
?? unsigned <成員名>:<二進制位數>
例如:
struct bytedata
{unsigned a:2;?? /*位段a,占2位*/
unsigned:6;? /*無名位段,占6位,但不能訪問*/
unsigned:0;???? /*無名位段,占0位,表下一位段從下一字邊界開始*/
unsigned b:10;? /*位段b,占10位*/
int i;????????? /*成員i,從下一字邊界開始*/
}data;
位段數據的引用:
同結構體成員中的數據引用一樣,但應注意位段的最大取值范圍不要超出二進制位數定的范圍,否則超出部分會丟棄。
例如:data.a=2;?? 但? data.a=10;就超出范圍(a占2位,最大3)
?
關于位段數據,注意以下幾點:
?
(1)一個位段必須存儲在同一存儲單元(即字)之中,不能跨兩個單元。如果其單元空間不夠,則剩余空間不用,從下一個單元起存放該位段。
(2)可以通過定義長度為0的位段的方式使下一位段從下一存儲單元開始。
(3)可以定義無名位段。
(4)位段的長度不能大于存儲單元的長度。也不能定義位段數組。
(5)位段無地址,不能對位段進行取地址運算。
(6)位段可以以%d,%o,%x格式輸出。
(7)位段若出現在表達式中,將被系統自動轉換成整數。
將struct和union類型結合使用,即發揮了指針運算的高效,又保護了原始數據不被破壞。具體實現方法如下:
typedef union??? /*8位位段分解類型*/
{char value;
struct
{unsigned b0:1;
unsigned b1:1;
unsigned b2:1;
unsigned b3:1;
unsigned b4:1;
unsigned b5:1;
unsigned b6:1;
unsigned b7:1;
}bits;
}
bits8;
這樣,用該結構來保存數據,即可以用.value來保存和訪問數據,又可以用.b0、.b1...來訪問第1、2...等位,非常方便。
總結
- 上一篇: 如果把整个因特网都印出来 你认为会怎么样
- 下一篇: Apache-不重启完成添加或更改域名