2014-02-21 160 views
0
#include<stdio.h> 
int main() 
{ 
    union emp; 
    union emp{ 
    int age; 
    char name[2]; 
    }; 
    union emp e1={512}; 
    printf("%d,%d,%d",e1.age,e1.name[0],e1.name[1]); 
    return 0; 
} 

這裏試圖craete工會和初始化其第一個成員,即「整數時代」。據我所知,ANSI C編譯器支持這一點。我的問題是爲什麼我得到像「512,0,2」的輸出。如果我用513,514和768代替512,我會得到以下輸出。 「513,1,2」, 「514,2,2」, 「768,0,3」, 現在我可以看到e1.name [0]正在存儲(數字)%256和e1 .name [1]正在存儲(數字)/ 256。 如果解釋爲什麼發生這種情況,將不勝感激。 謝謝大家。工會初始化在c

+0

看看http://stackoverflow.com/questions/346536/difference-between-a-structure-and-a-union-in-c – zakinster

回答

2

這是未定義的行爲,您不能在聯合中存儲字段並將其作爲另一種類型檢索。因此,你不能真正「期待」這段代碼的任何輸出,因爲就標準而言任何東西都是可以接受的。

見這樣的問題:A question about union in C

除了,由於512是2^9,假設整數是32位,字符是8位,這只是意味着你架構是小端,因爲512是在0x200。當您訪問e1.name[0]e2.name[1]時,您正在訪問存儲在內存中的512字節的前兩個字節,這顯然是0x00(最低有效字節)和0x2(最低有效字節後的下一個字節)。

0

想象一下:聯合可以容納兩個字符或一個int。如果將int存儲到聯合中,則也可以讀出兩個char部分,但它們將包含存儲的int的二進制部分。 所以在你的例子中,名字[0]將包含最初存儲的int的低16位,名字[1]將包含原始int的高16位。

1

這就是工會應該做的事情。它將相同的數據存儲在不同的數據類型中。對於你的價值觀

513 = 0x0201 
514 = 0x0202 
768 = 0x0300 

name[0]被存儲至少顯著字節,並name[1]被存儲最顯著字節。如果您使用的是不同的架構,則會顛倒過來。

+0

謝謝你解釋我的查詢。你的答案很簡短,但很清楚。現在我明白了這一點。 –