**:
【例】設count 是乙個16 位的無符號整型計數器,最大計數為十六進製制0xffff,要求將這個計數值以十六進製製半位元組的形式分解出來。
對於上述例項通常採用移位的方法求解,而採用共用體結構體位域的方法不需要通過移位運算。以下,對ccs 在標頭檔案中大量使用的共用體結構體位域進行註解。
先定義乙個共用體結構體位域:
…union 定義乙個共用體型別,它包含兩個成員:乙個是16 位無符號整型變數i,另乙個是包含4 個半位元組變數(low,mid0,mid1,high)的結構體型別。它們占用同乙個記憶體單元,通過對i(count.i)進行賦值,可以完成對結構體4 個變數的賦值。uint16 cont,g,s,b,q; //16 位無符號整型變數定義
cont
=0xfedc
; //對cont 賦值
… union //共用體型別定義
halfbyte; //halfbyte 為具有所定義的結構體型別的變數
}count; //count為具有所定義的共用體型別的變數
上面的程式,在定義共用體型別和結構體型別的同時,直接完成了這兩個型別變數的定義,而未定義共用體和結構體型別名。即halfbyte 是乙個具有所定義的結構體型別的變數,count 是乙個具有所定義的共用體型別的變數。理解了共用體與結構體之間的關係,下面的賦值指令就清楚了。
count.i = cont; //對共用體型別成員i 進行賦值
g通過共用體結構體定義,當對共用體型別成員i 進行賦值時,由於結構體型別變數halfbyte 與i 占用同乙個記憶體單元,因此,也就完成了對halfbyte 的各成員的賦值。= 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
c 語言的共用體結構體位域定義,可以完成對暫存器位域的訪問。至於被訪問的位域在記憶體中的具體位置則由編譯器安排,程式設計者可以不必關注。
下面是乙個訪問暫存器位域的例子,供讀者參考。
先建立乙個共用體結構體位域定義,將某個暫存器的16 位,從最低位到最高位分別
定義為bit1,bit2,…,bit16。
union //共用體型別定義有了上面的定義之後,要訪問某乙個位或某些位就很容易了。比如要置bit4,bit8,bit12 及bit16 為1,可用兩種方法進行:bit; //bit為具有所定義的結構體型別的變數
}ctrlbit; //ctrlbit 為具有所定義的共用體型別的變數
方法一:
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 共...