UNION IN C (Каким будет выход) - PullRequest
1 голос
/ 06 сентября 2010
union a
{
 int x;
 char a[2];
}

Если мы присвоим 512 значение x и попытаемся напечатать [0] и a [1], то что будет выходным объясните пожалуйста как?

Ответы [ 4 ]

5 голосов
/ 06 сентября 2010

Согласно стандарту, результат записи одному члену союза, а затем чтению другого не определен. Может случиться что угодно.

Реально, если вы запустите код на машине с прямым порядком байтов, a [0], вероятно, будет 0, а [1], вероятно, будет 2. На 16-битной машине с прямым порядком байтов a [0] будет 2, а [1] будет 0. На 32-битной машине с прямым порядком байтов (несуществующей, как вы уже определили вещи) a [2] будет 2, а [0], a [1 ], & a [3] будет 0.

3 голосов
/ 06 сентября 2010

I зависит от порядкового номера платформы. На платформах с прямым порядком байтов (Intel) a [0] будет иметь младший байт целого числа (4 байта), поэтому [0] будет содержать 0x00, а [1] 0x02

1 голос
/ 06 сентября 2010

Это зависит от порядкового номера компьютера, на котором он запущен:

в действительности объединение использует одну и ту же память для вашего int и ваших символов, поэтому

int           512 (ie 0x200)
char[4]       0x00 0x00 0x02 0x00  little endian, so a[0]=0, a[1]=0
char[4]       0x00 0x02 0x00 0x00  big endian   , so a[0]=0, a[1]=2

(на самом деле, я мог бы иметь маленький и большой порядок байтов не туда)

0 голосов
/ 06 сентября 2010

Объединения в C совместно используют одно пространство памяти, то есть x и a [2] начинаются в одной и той же области памяти. Когда вы присваиваете значение одному из них, другое перезаписывается.

В вашем случае, когда вы назначите 512 для x, вы также напишите его байты в char, как только что объяснил Фернандо Мигелес ...

...