union 共用體的使用

2022-08-02 11:57:09 字數 1743 閱讀 1113

所謂的大端模式,是指資料的低位(就是權值較小的後面那幾位)儲存在記憶體的高位址中,而資料的高位,儲存在記憶體的低位址中,這樣的儲存模式有點兒類似於把資料當作字串順序處理:位址由小向大增加,而資料從高位往低位放;

所謂的小端模式,是指資料的低位儲存在記憶體的低位址中,而數 據的高位儲存在記憶體的高位址中,這種儲存模式將位址的高低和資料位權有效地結合起來,高位址部分權值高,低位址部分權值低,和我們的邏輯方法一致。

為什麼會有大小端模式之分呢?這是因為在計算機系統中,我們是以位元組為單位的,每個位址單元都對應著乙個位元組,乙個位元組為 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是大端模式還是小端模式。

由於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位系統)佔乙個位元組,會存在資料的丟失。這時候可以通過乙個共用體來解決。

還是先看**吧,(*^__^*)

輸出結果是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 共用體的使用

union 共用體名 變數名 共用體表示幾個變數共用乙個記憶體位置,在不同的時間儲存不同的資料型別和不同長度的變數。在union中,所有的共用體成員共用乙個空間,並且同一時間只能儲存其中乙個成員變數的值。正是利用union這個公用同塊位址的特點可以有很多的用途。1.cpu大小端的測試 首先了解下大小...

union 共用體名

union 共用體名 變數名 共用體表示幾個變數共用乙個記憶體位置,在不同的時間儲存不同的資料型別和不同長度的變數。在union中,所有的共用體成員共用乙個空間,並且同一時間只能儲存其中乙個成員變數的值。正是利用union這個公用同塊位址的特點可以有很多的用途。1.cpu大小端的測試 首先了解下大小...

共用體 union 的用法

以前c語言學到union的時候,總是疑惑這傢伙該怎麼用,有什麼存在的價值,後來接觸到的東西多了,發現union這個定義還是有他的用武之地的。在定義union資料結構的時候,利用位差就可以很容易的讀出多位元組資料的高地位,甚至單個位元組的資料。例如 利用共用體型別的特點分別取出short型變數高位元組...