找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 9801|回復(fù): 0
打印 上一主題 下一主題
收起左側(cè)

C語言結(jié)構(gòu)體之位域詳解

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:102668 發(fā)表于 2016-1-16 07:01 | 只看該作者 回帖獎勵 |倒序?yàn)g覽 |閱讀模式
                       

結(jié)構(gòu)體之位域

注:很久沒看C了,一看就應(yīng)驗(yàn)了那句"C語言博大精深"的話。這幾天恰好要學(xué)學(xué)網(wǎng)絡(luò),所以必定要自定義一些包發(fā)送出去,這就不能不涉及到Struct結(jié)構(gòu)了。這個內(nèi)容在譚浩強(qiáng)的書里面也有講,可惜當(dāng)時教學(xué)的時候一跳而過,自己也沒這么看這個部分,早就忘掉了。如今一看還記不起來了,直到有天我再次翻開課本的時候,看到那節(jié),種似曾相識的感覺,才發(fā)覺早已看過了。

有些信息在存儲時,并不需要占用一個完整的字節(jié), 而只需占幾個或一個二進(jìn)制位。例如在存放一個開關(guān)量時,只有0和1兩種狀態(tài),用一位二進(jìn)位即可。為了節(jié)省存儲空間,并使處理簡便,C語言又提供了一種數(shù)據(jù)結(jié)構(gòu),稱為"位域"或"位段"。所謂"位域"是把一個字節(jié)中的二進(jìn)位劃分為幾個不同的區(qū)域,并說明每個區(qū)域的位數(shù)。每個域有一個域名,允許在程序中按域名進(jìn)行操作。這樣就可以把幾個不同的對象用一個字節(jié)的二進(jìn)制位域來表示。一、位域的定義和位域變量的說明位域定義與結(jié)構(gòu)定義相仿,其形式為:

struct 位域結(jié)構(gòu)名

{ 位域列表 };

其中位域列表的形式為: 類型說明符 位域名:位域長度

例如:

struct bs

{

int a:8;

int b:2;

int c:6;

};

位域變量的說明與結(jié)構(gòu)變量說明的方式相同。 可采用先定義后說明,同時定義說明或者直接說明這三種方式。例如:

struct bs

{

int a:8;

int b:2;

int c:6;

}data;

說明data為bs變量,共占兩個字節(jié)。其中位域a占8位,位域b占2位,位域c占6位。對于位域的定義尚有以下幾點(diǎn)說明:

1.一個位域必須存儲在同一個字節(jié)中,不能跨兩個字節(jié)。如一個字節(jié)所?臻g不夠存放另一位域時,應(yīng)從下一單元起存放該位域。也可以有意使某位域從下一單元開始。例如:

struct bs

{

unsigned a:4

unsigned :0

unsigned b:4

unsigned c:4

}

在這個位域定義中,a占第一字節(jié)的4位,后4位填0表示不使用,b從第二字節(jié)開始,占用4位,c占用4位。

2. 由于位域不允許跨兩個字節(jié),因此位域的長度不能大于一個字節(jié)的長度,也就是說不能超過8位二進(jìn)位。

3. 位域可以無位域名,這時它只用來作填充或調(diào)整位置。無名的位域是不能使用的。例如:

struct k

{

int a:1

int :2

int b:3

int c:2

};

從以上分析可以看出,位域在本質(zhì)上就是一種結(jié)構(gòu)類型, 不過其成員是按二進(jìn)位分配的。

二、位域的使用位域的使用和結(jié)構(gòu)成員的使用相同,其一般形式為位域變量名·位域名位域允許用各種格式輸出。

main(){

struct bs

{

unsigned a:1;

unsigned b:3;

unsigned c:4;

} bit,*pbit;

bit.a=1;

bit.b=7;

bit.c=15;

printf("%d,%d,%d\n",bit.a,bit.b,bit.c);

pbit=&bit;

pbit->a=0;

pbit->b&=3;

pbit->c|=1;

printf("%d,%d,%d\n",pbit->a,pbit->b,pbit->c);

}

上例程序中定義了位域結(jié)構(gòu)bs,三個位域?yàn)閍,b,c。說明了bs類型的變量bit和指向bs類型的指針變量pbit。這表示位域也是可以使用指針的。程序的9、10、11三行分別給三個位域賦值。(應(yīng)注意賦值不能超過該位域的允許范圍)程序第12行以整型量格式輸出三個域的內(nèi)容。第13行把位域變

量bit的地址送給指針變量pbit。第14行用指針方式給位域a重新賦值,賦為0。第15行使用了復(fù)合的位運(yùn)算符"&=",該行相當(dāng)于:pbit->b=pbit->b&3位域b中原有值為7,與3作按位與運(yùn)算的結(jié)果為3(111&011=011,十進(jìn)制值為3)。同樣,程序第16行中使用了復(fù)合位運(yùn)算"|=",相當(dāng)于: pbit->c=pbit->c|1其結(jié)果為15。程序第17行用指針方式輸出了這三個域的值。



分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏1 分享淘帖 頂1 踩
回復(fù)

使用道具 舉報(bào)

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表