2016-12-18 13 views
0

は私がインタビューにあったし、次のコードは、私に与えられた: -連合とメモリ管理

union mix 
{ 
    int i; 
    char c[2]; 
}; 

int main() 
{ 
    union mix key; 
    key.i=512; 
    printf("\n %d,%d,%d",key.i,key.c[0],key.c[1]); 
    return 0; 
} 

と私は家に来て、システム上でそれを実行したとき、私は出力を得た: - 512,0 、2

誰でもそれを私に説明することができますどのように動作するのか、なぜc [1] = 2ですか?

編集: - 私が知っているのは、メモリ内のビットストレージに関連していることです。

+2

Cの開発者とのインタビューで、データ型とメモリの仕組みがわからない場合は、申し訳ありません...データがメモリにどのように格納されているかを理解しておく必要があります。 –

+0

サミーそれは、Cの開発者のCのスキルをテストすることを決めたJavaのためのインタビューだったCのdevlooerのためのインタビューではなかった:D – NeoR

+0

@ NeoR:まあ、それは素敵じゃない... – alk

答えて

5

これはユニオンであり、つまり、icが同じメモリを占有していることを意味します。
512は0x200であり、最初のバイトがゼロであり、2番目が2である(各バイトは2桁の16進数を取る)ことを意味する。
もちろん、これはCPUのエンディアンに依存します。

+0

エンディアンについて説明できますか? – NeoR

+0

@NeoR - 私はできましたが、ウィキペディアはそれをもっと良くすることができます:https://en.wikipedia.org/wiki/Endianness。これは基本的にバイトが整列される順序です。あなたの例はリトルエンディアンです。 –

+0

私は、OPコードが 'key.c [0] = 0'と' key.c [1] = 2'を_decimal_値として出力し、これらが指定されたバイトの_decimal_表現であることを指摘する価値があると思います。 「0x00」=「0」、「0x02」=「2」ということは偶然である。言い換えれば、 'key.i = 350'ならば、結果は16進表現のようには見えません。 –