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