# 配置 - visualforce 新規 レコード
sizeof
intが
4 bytes (32 bits)でsizeofが
1 byte (8 bits) 、整数が2の補数形式で表されるリトルエンディアンシステムを使用すると仮定します。
unionは最大のメンバのサイズしか持たず、すべてのメンバがこの正確なメモリを指しています。
さて、このメモリに
512整数値を書いています。
バイナリで512は
1000000000です。
または32ビットの2の補数形式で指定します。
00000000 00000000 00000010 00000000 。
これをリトルエンディアン表現に変換すると、次のようになります：
|______| |______|
| |
y[0] y[1]
ここで、
char配列のインデックスを使ってアクセスするときに起こることを見てみましょう。
従って、
y[0]は
00000000であり、これは
0 、
y[1]は
00000010であり、
2 。
私はCプログラミング言語に関するこの客観的な質問に出くわしました。 次のコードの出力は
0 2となっていますが、理由はわかりません。
初期化のプロセスを説明してください。 コードは次のとおりです：
#include <stdio.h>
int main()
union a
int x;
char y[2];
};
union a z = {512};
printf("\n%d %d", z.y[0], z.y[1]);
return 0;
}
スタンダードによれば、
### 6.2.5タイプ：
共用体型は
、重複しない空でない組のメンバー・オブジェクトの集合を記述 します。各組は、オプションで指定された名前と可能であれば特殊な型を持ちます。 コンパイラは、この空間内で互いに重なり合う最大のメンバーに十分なスペースだけを割り当てます 。 あなたの場合、メモリは
intデータ型（4バイトと仮定）に割り当てられます。 この線
union
z最初のメンバーを初期化します。つまり、
xは
512ます。 バイナリでは、32マシン上で
0000 0000 0000 0000 0000 0010 0000 0000と表されます。
このためのメモリ表現は、マシンアーキテクチャに依存する。 32ビットマシンでは、どちらかのようになります（最小のアドレスに最下位バイトを格納する -
リトルエンディアン ）
（
zy[0]はaddrees
0x1000のコンテンツにアクセスし、
zy[1]は
0x1001アドレスのコンテンツにアクセスし、これらのコンテンツは上記の表現に依存します。
あなたのマシンはリトルエンディアンの表現をサポートしているようですので、
zy[0] = 0と
zy[1] = 2
0 2 、出力は
0 2ます。
しかし、
*セクション6.5.2.3の脚注95に*は、
ユニオンオブジェクトの内容を読み取るために使用されたメンバが、最後にオブジェクトに 値を格納するために使用されたメンバと同じでない場合、その値のオブジェクト表現の適切な部分が、新しい型のオブジェクト表現として再解釈されます。 6.2.6で説明されています（時には「型打ち」と呼ばれるプロセス）。 これはトラップ表現かもしれません。
共用体に割り当てられるメモリーは、共用体内の最大の型のサイズです（この場合は
intです）。 あなたのシステムの
intのサイズが2バイトであるとしましょう
512は
0x200になり
0x200 。
| | |
-------------------
Byte 1 Byte 0
したがって、最初のバイトは
0で、2番目のバイトは
2です（リトルエンディアンシステムでは）
charはすべてのシステムで1バイトです。
したがって、アクセス
zy[0]と
zy[1]はバイト単位のアクセスです。
私はちょうどあなたにメモリがどのように割り当てられ、値が格納されているかを教えています。出力がそれらに依存するので、以下の点を考慮する必要があります。
注目すべきポイント：
- 出力は完全にシステムに依存します。
- endianessと
sizeof(int)はシステムによって異なります。
PS：両方のメンバーが占有していたメモリは、組合で同じです。
自動（非静的）メンバーの場合、初期化は次の割り当てと同じです。
union a z;