配置 - visualforce 新規 レコード




Cでのユニオンの初期化 (4)

sizeof int4 bytes (32 bits)でsizeofが1 byte (8 bits) 、整数が2の補数形式で表されるリトルエンディアンシステムを使用すると仮定します。 unionは最大のメンバのサイズしか持たず、すべてのメンバがこの正確なメモリを指しています。

さて、このメモリに512整数値を書いています。

バイナリで512は1000000000です。

または32ビットの2の補数形式で指定します。

00000000 00000000 00000010 00000000

これをリトルエンディアン表現に変換すると、次のようになります:

00000000 00000010 00000000 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 a z = {512};

union z最初のメンバーを初期化します。つまり、 x512ます。 バイナリでは、32マシン上で0000 0000 0000 0000 0000 0010 0000 0000と表されます。

このためのメモリ表現は、マシンアーキテクチャに依存する。 32ビットマシンでは、どちらかのようになります(最小のアドレスに最下位バイトを格納する - リトルエンディアン

Address     Value
0x1000      0000 0000
0x1001      0000 0010
0x1002      0000 0000 
0x1003      0000 0000

Big Endianの最も小さいアドレスに最上位バイトを格納する)

Address     Value
0x1000      0000 0000
0x1001      0000 0000
0x1002      0000 0010 
0x1003      0000 0000

zy[0]はaddrees 0x1000のコンテンツにアクセスし、 zy[1]0x1001アドレスのコンテンツにアクセスし、これらのコンテンツは上記の表現に依存します。
あなたのマシンはリトルエンディアンの表現をサポートしているようですので、 zy[0] = 0zy[1] = 2 0 2 、出力は0 2ます。

しかし、 セクション6.5.2.3の脚注95には、

ユニオンオブジェクトの内容を読み取るために使用されたメンバが、最後にオブジェクト値を格納するために使用されたメンバと同じでない場合、その値のオブジェクト表現の適切な部分が、新しい型のオブジェクト表現として再解釈されます。 6.2.6で説明されています(時には「型打ち」と呼ばれるプロセス)。 これはトラップ表現かもしれません


共用体に割り当てられるメモリーは、共用体内の最大の型のサイズです(この場合はintです)。 あなたのシステムのintのサイズが2バイトであるとしましょう

5120x200になり0x200

Represenataionは次のように見えます:

0000 0010 0000 0000
|        |         |
------------------- 
Byte 1     Byte 0

したがって、最初のバイトは0で、2番目のバイトは2です(リトルエンディアンシステムでは)

charはすべてのシステムで1バイトです。

したがって、アクセスzy[0]zy[1]はバイト単位のアクセスです。

z.y[0] = 0000 0000 = 0
z.y[1] = 0000 0010 = 2

私はちょうどあなたにメモリがどのように割り当てられ、値が格納されているかを教えています。出力がそれらに依存するので、以下の点を考慮する必要があります。

注目すべきポイント:

  1. 出力は完全にシステムに依存します。
  2. endianesssizeof(int)はシステムによって異なります。

PS:両方のメンバーが占有していたメモリは、組合で同じです。


自動(非静的)メンバーの場合、初期化は次の割り当てと同じです。

union a z;
z.x = 512;




unions