共用體應用例項(2)

2021-06-03 23:51:08 字數 1822 閱讀 2846

**:

【例】設count 是乙個16 位的無符號整型計數器,最大計數為十六進製制0xffff,要求將這個計數值以十六進製製半位元組的形式分解出來。

對於上述例項通常採用移位的方法求解,而採用共用體結構體位域的方法不需要通過移位運算。以下,對ccs 在標頭檔案中大量使用的共用體結構體位域進行註解。

先定義乙個共用體結構體位域:

…  

uint16 cont,g,s,b,q; //16 位無符號整型變數定義  

cont

=0xfedc

; //對cont 賦值  

…  union //共用體型別定義  

halfbyte; //halfbyte 為具有所定義的結構體型別的變數  

}count; //count為具有所定義的共用體型別的變數 

union 定義乙個共用體型別,它包含兩個成員:乙個是16 位無符號整型變數i,另乙個是包含4 個半位元組變數(low,mid0,mid1,high)的結構體型別。它們占用同乙個記憶體單元,通過對i(count.i)進行賦值,可以完成對結構體4 個變數的賦值。

上面的程式,在定義共用體型別和結構體型別的同時,直接完成了這兩個型別變數的定義,而未定義共用體和結構體型別名。即halfbyte 是乙個具有所定義的結構體型別的變數,count 是乙個具有所定義的共用體型別的變數。理解了共用體與結構體之間的關係,下面的賦值指令就清楚了。

count.i = cont; //對共用體型別成員i 進行賦值

g

= count

.halfbyte.low; //將cont 的0~3 位賦值給g,g=

0x000cs= 

count

.halfbyte.mid0; //將cont 的4~7 位賦值給s,s=

0x000db= 

count

.halfbyte.mid1; //將cont 的8~11 位賦值給b,b=

0x000eq= 

count

.halfbyte.high; //將cont 的12~15 位賦值給q,q=

0x000f

通過共用體結構體定義,當對共用體型別成員i 進行賦值時,由於結構體型別變數halfbyte 與i 占用同乙個記憶體單元,因此,也就完成了對halfbyte 的各成員的賦值。

c 語言的共用體結構體位域定義,可以完成對暫存器位域的訪問。至於被訪問的位域在記憶體中的具體位置則由編譯器安排,程式設計者可以不必關注。

下面是乙個訪問暫存器位域的例子,供讀者參考。

先建立乙個共用體結構體位域定義,將某個暫存器的16 位,從最低位到最高位分別

定義為bit1,bit2,…,bit16。

union //共用體型別定義  

bit; //bit為具有所定義的結構體型別的變數  

}ctrlbit; //ctrlbit 為具有所定義的共用體型別的變數 

有了上面的定義之後,要訪問某乙個位或某些位就很容易了。比如要置bit4,bit8,bit12 及bit16 為1,可用兩種方法進行:

方法一:

ctrlbit.bit.bit4= 1

;  ctrlbit.bit.bit8= 1

;  ctrlbit.bit.bit12

= 1;  

ctrlbit.bit.bit16

= 1; 

方法二:

ctrlbit.all

= 0x8888

; (ps:這個使用例項充分利用了union的定義和結構特性,使得可以直接對資料的某些位進行操作,很巧妙)

c語言共用體例項使用

一 共用體介紹 共用體,結構和結構體類似,在記憶體上面共享乙個記憶體,記憶體大小為最大的成員記憶體 例如 union data data 3個成員,最大的成員為str陣列,20位元組,那麼共用體占用記憶體為20位元組,i對應位byte0 3,f對應byte0 3,str對應byte0 19二 定義 ...

結構體與共用體的複習(2)

指向結構體變數的指標 乙個結構體變數的指標就是該變數所佔據的記憶體段的起始位址。可以設乙個指標變數,用來指向乙個結構體變數,此時該指標變數的值是結構體變數的起始位址。指標變數也可以用來指向結構體陣列中的元素。include include int main struct student stu 1 ...

結構體 共用體

結構體 結構體的定義1 struct mystruct 定義新變數 struct mystruct s1 結構體定義2 typedef struct mystruct mstrct 定義新變數 mstrct s1 結構體定義3 type struct mstrct 定義新變數 mstrct s1 共...