日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

11、位段

發(fā)布時(shí)間:2023/12/4 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 11、位段 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

?

位段以位為單位定義結(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é)

以上是生活随笔為你收集整理的11、位段的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。