union 共用體名 變數名;
共用體表示幾個變數共用乙個記憶體位置,在不同的時間儲存不同的資料型別和不同長度的變數。在union中,所有的共用體成員共用乙個空間,並且同一時間只能儲存其中乙個成員變數的值。
正是利用union這個公用同塊位址的特點可以有很多的用途。
1.cpu大小端的測試
首先了解下大小端模式:
所謂的大端模式,是指資料的低位(就是權值較小的後面那幾位)儲存在記憶體的高位址中,而資料的高位,儲存在記憶體的低位址中,這樣的儲存模式有點兒類似於把資料當作字串順序處理:位址由小向大增加,而資料從高位往低位放;
所謂的小端模式,是指資料的低位儲存在記憶體的低位址中,而數 據的高位儲存在記憶體的高位址中,這種儲存模式將位址的高低和資料位權有效地結合起來,高位址部分權值高,低位址部分權值低,和我們的邏輯方法一致。
為什麼會有大小端模式之分呢?這是因為在計算機系統中,我們是以位元組為單位的,每個位址單元都對應著乙個位元組,乙個位元組為 8bit。但是在c語言中除了8bit的char之外,還有16bit的short型,32bit的long型(要看具體的編譯器),另外,對於位數大於 8位的處理器,例如16位或者32位的處理器,由於暫存器寬度大於乙個位元組,那麼必然存在著乙個如何將多個位元組安排的問題。因此就導致了大端儲存模式和小端儲存模式。例如乙個16bit的short型x,在記憶體中的位址為0x0010,x的值為0x1122,那麼0x11為高位元組,0x22為低位元組。對於 大端模式,就將0x11放在低位址中,即0x0010中,0x22放在高位址中,即0x0011中。小端模式,剛好相反。我們常用的x86結構是小端模式,而keil c51則為大端模式。很多的arm,dsp都為小端模式。有些arm處理器還可以由硬體來選擇是大端模式還是小端模式。
舉個例子
2bit
寬的數0x12345678
在little-endian
模式cpu
記憶體中的存放方式(假設從位址
0x4000
開始存放)為:
記憶體位址
0x4000
0x4001
0x4002
0x4003
存放內容
0x78
0x56
0x34
0x12 而在
big-endian
模式cpu
記憶體中的存放方式則為:
記憶體位址
0x4000
0x4001
0x4002
0x4003
存放內容
0x12
0x34
0x56
0x78
下面這段**能夠簡單的測試你的cpu是大端模式還是小端模式。
#include union test
; int main()
else
return 0;
}
由於union test公用記憶體,test.i(假設)在記憶體中00······01存在,低位元組包含了1,高位元組都是0。若是小端模式儲存,
那麼test.a的位址(低位址)裡存的就是該是0x01。否則就是0。
可以通過這個小測試來檢驗。
2.unsigned int型轉化成unsigned char型別
由於unsigned int 佔四個位元組(vc下,32位系統),假設存了乙個比較大的數,要是強制轉化成unsigned char型別(vc下,32位系統)佔乙個位元組,會存在資料的丟失。這時候可以通過乙個共用體來解決。
還是先看**吧,(*^__^*)
#includeunion uname
;
int main()
輸出結果是44,33,22,11。為什麼不是11,22,33,44呢?這就是上面說的cpu的大小端了。
由於我的cpu是小端模式的,因此高位址存高位元組,低位址存低位元組。un1.date存放形式 (參考下圖)。un1.buffer[i]從低位址到高位址讀取,每次都是乙個位元組。通過這樣的形式就能訪問unsigned int中的各個位了。
記憶體位址
0x4000
0x4001
0x4002
0x4003
存放內容
0x44
0x33
0x22
0x11
共用體 union 的用法
以前c語言學到union的時候,總是疑惑這傢伙該怎麼用,有什麼存在的價值,後來接觸到的東西多了,發現union這個定義還是有他的用武之地的。在定義union資料結構的時候,利用位差就可以很容易的讀出多位元組資料的高地位,甚至單個位元組的資料。例如 利用共用體型別的特點分別取出short型變數高位元組...
union 共用體的使用
union 共用體名 變數名 共用體表示幾個變數共用乙個記憶體位置,在不同的時間儲存不同的資料型別和不同長度的變數。在union中,所有的共用體成員共用乙個空間,並且同一時間只能儲存其中乙個成員變數的值。正是利用union這個公用同塊位址的特點可以有很多的用途。1.cpu大小端的測試 首先了解下大小...
union 共用體的使用
所謂的大端模式,是指資料的低位 就是權值較小的後面那幾位 儲存在記憶體的高位址中,而資料的高位,儲存在記憶體的低位址中,這樣的儲存模式有點兒類似於把資料當作字串順序處理 位址由小向大增加,而資料從高位往低位放 所謂的小端模式,是指資料的低位儲存在記憶體的低位址中,而數 據的高位儲存在記憶體的高位址中...