3

ユニオンの仕組みが理解できませんでした..

#include <stdio.h>
#include <stdlib.h>

int main()
{
    union {
    int a:4;
    char b[4];
    }abc;
abc.a = 0xF;

    printf(" %d, %d, %d, %d, %d, %d\n", sizeof(abc), abc.a, abc.b[0], abc.b[1], abc.b[2], abc.b[3]);

    return 0;
}

ここに画像の説明を入力
上記のプログラムでは.
私が作ったint a : 4;
ので、4ビットを取るべきです。
今私は保存し ていますので、出力が次のように来ない理由a = 0xF; //i.e a= 1111(Binary form)
にアクセスしているときにb[0 0r 1 or 2 or 3]1, 1, 1, 1

4

4 に答える 4

3

ユニオンの合計サイズは少なくとも になり4 * sizeof(char)ます。

使用しているコンパイラがこれを定義済みの動作として処理すると仮定すると、次の点を考慮してください。

  1. abc完全に初期化されることはないため、0 と 1 のランダムな組み合わせが含まれています。大問題。したがって、最初にこれを行います:
    memset(&abc, 0, sizeof(abc));
  2. ユニオンはその最大のメンバーのサイズである必要があるため、ゼロ化された 4バイトが必要です。00000000 00000000 00000000 00000000
  3. 4ビットの高さだけを設定しているので、共用体は次のようになります:
    00000000 00000000 00000000 00001111 または
    11110000 00000000 00000000 00000000.

    あなたのコンパイラがこのタイプのアラインメントをどのように処理するかはわかりませんので、これが私にできる最善の方法です。

また、バイナリ形式の各ビットの値を手動で検査できるように、文字からビットへの変換を行うことを検討することもできます:
char c++ の個々のビットにアクセスする

頑張ってください!

于 2012-05-30T13:38:45.490 に答える
2

0xF は 4 ビットの符号付きとして見ると -1 であるため、出力は正常です。b は完全に割り当てられていないため、値は未定義です。これは 4 バイトのエンティティですが、4 ビットのエンティティのみを割り当てます。だから、私にはすべてが正常に見えます。

于 2012-05-30T13:32:56.207 に答える
0

everycharは (ほとんどのプラットフォームで) 1 バイト、つまり 8 ビットを使用するため、 の 4 ビットすべてがaの 1 つの要素に分類されb[]ます。

それに加えて、ビットフィールドがどのように格納されるかはコンパイラに依存するため、定義されていないため、b[]そのマップのどのバイトに...

于 2012-05-30T13:30:37.220 に答える
0

0xF は、4 ビットの符号付き数値として定義した場合は -1 です。理由を理解するには、 2 の補数のバイナリ表現を確認してください。

また、 を初期化していないbため、ランダムな値を保持している可能性があります。

于 2012-05-30T13:33:54.880 に答える