union test
{
int i;
char ch;
}t;
int main()
{
t.ch=20;
}
と仮定sizeof(int)==2
及び2001
、Tに割り当てられたメモリアドレス2000であるせ、次いで20すなわちt.ch
が格納されている - 2000、2001年またはマシンのエンディアンに依存?組合員はどのように保管されていますか?
union test
{
int i;
char ch;
}t;
int main()
{
t.ch=20;
}
と仮定sizeof(int)==2
及び2001
、Tに割り当てられたメモリアドレス2000であるせ、次いで20すなわちt.ch
が格納されている - 2000、2001年またはマシンのエンディアンに依存?組合員はどのように保管されていますか?
C99標準(§6.7.2.1.14)はこう述べています。組合の
サイズはメンバーの最大を含むのに十分なものです。 の値は、ほとんどのメンバーをいつでもユニオンオブジェクトに格納できます。 適切に変換された ユニオンオブジェクトへのポインタ(またはメンバがビット フィールドの場合は、それが存在するユニット)、その逆の場合も同様です。
(強調追加)
太字の文は、実際には労働組合の各メンバーが同じアドレスを持っていることを述べているので、それらはすべて同じアドレスに「始まり」。 t
のようにt.ch
をt.i
とすると、t.i
の最初のバイト(アドレス順)と重複しているため、t.ch
がアドレス2000になるはずです。
現実世界のを「t.i
」として読み込もうとするとどうなるのでしょうか?というのは、プラットフォームのエンディアンに依存し、実際に別のエンディアンを書き込んだとき1つはC標準(§6.2.6.1.6/ 7、§1.1で再掲)に従って不特定の行動である。
union
{
int i;
unsigned char ch[sizeof(i)];
} t;
が
t.i=20;
をやって:(少なくとも、私はそれを理解することがより簡単だと思う)、マシンのエンディアンを理解するために多くを助け何
は、このような労働組合を持つことです
とし、2つの文字の中に何が入っているのかをt.ch
で調べます。リトルエンディアンマシンの場合は、t.ch[0]==20
とt.ch[1]==0
、ビッグエンディアンマシンの場合は逆の場合があります(sizeof(int)==2
の場合)。すでに述べたように、これは実装固有の詳細なものであり、標準ではエンディアンも言及していません。
2バイトのint
が20に設定されている場合、リトルエンディアンのマシンで、それに関連付けられたメモリをアドレス順にダンプすると、16進表現で表示されます。 )スペースによって分割バイト:
14 00
あなたはビッグエンディアン表現があるために、私たちの観点から、「もっと右」に見える
00 14
得るでしょうビッグエンディアンのマシン上ながら、リトルエンディアン表現で全体を作るバイト数int
は逆の順序で格納されます。 2000または2001に格納されている20かどうか、つまり
int a=20;
printf("%d",* (char*)&a);
はその後、出力はエンディアンに依存しません。また
私はこれを行う場合と言っています?
はい、ここにありますが、あなたの質問では別のことを尋ねています。これはもっと見える私のの例です。
ありがとうマッテオ。実際にあなたとプラチナ・アズールは反対のことを言っているので、私は混乱しました。 –
@Happy Mittal:最新のコメントで説明しましたが、これはint-to-char変換を持つ古いコメントを使用していました。事実は残っています。アーキテクチャがどのようなエンディアンを使用していても、リテラル「20」で表される16ビットの数値はBOTHバイトに格納されます。それはちょうど1バイトまたは他がゼロになることです。 '257'のような数値を格納すると、両方のバイトが非ゼロになります。 –
テストでは2バイトがかかり、アドレス2000,2002などで割り当てられます。また、ユニオンの各インスタンスの値はそのベースアドレスから格納されます。
ユニオンの各メンバーは、そのユニオンのインスタンスの同じアドレスに格納されます。そのため、同時にユニオンに1つのタイプの値しか格納できません。したがって、ユニオンは、最大のメンバに必要なバイト数を占有します。
endian-nessがunionが格納されている場所と関係があるかどうかはわかりません...すべてのunion typesが同じ場所(つまり、ゼロオフセット)に格納されているわけではありませんか? (良い質問ですが!) –
2001では、アーキテクチャによってはアライメントの合っていないメモリアクセスが遅くなったり禁止されたりする可能性があります。 –
@Platinum Azure:単純にint a = 20を定義すると、それは20が格納されているエンディアンに依存しませんか? –