3
#include<stdio.h>

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

main() {

    union node n;
    n.c[0] = 0;
    n.c[1] = 2;
    printf("%d\n", n.i);
    return 0;
}

512c[0] 値が最初のバイトに格納され、c[1] 値が 2 番目のバイトに格納されるため、出力が得られると思いますが、 1965097472. どうして ?。このプログラムを Windows のコードブロックでコンパイルしました。

4

5 に答える 5

8

ユニオンは、次のように開始して4バイトを割り当てます。

[????] [????] [????] [????]

最下位2バイトを設定します。

[????] [????] [0x02] [0x00]

次に、4バイトすべてを整数として出力します。512これらの最も重要な2バイトには何でも含まれる可能性があるため、必ずしも取得することはありません。この場合、次のようになります。

[0x75] [0x21] [0x02] [0x00]
于 2012-07-07T07:12:35.077 に答える
3

未定義の動作のため。union設定されていないメンバーにアクセスすると、それは簡単です。何でもでき、何でも印刷でき、クラッシュすることさえあります。

于 2012-07-07T07:07:04.007 に答える
1

未定義の動作は、まあ... 未定義です。

特定の結果が与えられた理由を答えようとすることはできますが(他の答えは、コンパイラの実装の詳細を推測することによってそれを行います)、別の結果が与えられなかった理由を言うことはできません。私たちが知っている限りでは、コンパイラは 0 を印刷したり、ハード ドライブをフォーマットしたり、家に火を放ったり、1 億米ドルを銀行口座に送金したりできた可能性があります。

于 2012-07-07T07:27:44.587 に答える
0

あなたは少なくとも4バイトである可能性が高いことに注意してくださいint(古き良き時代のように2バイトではありません)。サイズを一致させるには、タイプをに変更iuint16_tます。

この後でも、標準では、1つのユニオンメンバーを設定してから、バイトを再解釈するために別のユニオンメンバーにアクセスすることは実際には許可されていません。ただし、。を使用しても同じ効果が得られる可能性がありますreinterpret_cast

union node {
    uint16_t i;
    uint8_t c[2];
};

int main() {
    union node n;
    n.c[0] = 0;
    n.c[1] = 2;
    std::cout << *reinterpret_cast<uint16_t *>(&n) << std::endl;
    return 0;
}
于 2012-07-07T07:13:54.633 に答える
0

int32 ビット数値、リトル エンディアンとしてコンパイルされます。下位 2 バイトをそれぞれ 2 と 0 に設定してから int を読み取ると、1965097472 が得られます。プログラムが実行されているプラ​​ットフォームの。

于 2012-07-07T07:18:30.987 に答える