Почему мой союз не показывает правильные значения? - PullRequest
13 голосов
/ 19 мая 2010
union
{ int i;
  bool b;
} x;

x.i = 20000;
x.b = true;
cout << x.i;

Распечатывается 19969. Почему не печатается 20000?

Ответы [ 4 ]

31 голосов
/ 19 мая 2010

A union не является struct. В union все данные занимают одно и то же пространство и могут обрабатываться как разные типы через имена полей. Когда вы присваиваете true для x.b, вы перезаписываете младшие биты 20000.

Более конкретно:

20000 в двоичном виде: 100111000100000

19969 в двоичном виде: 100111000000001

Здесь произошло то, что вы поместили однобайтовое значение 1 (00000001) в 8 младших битов 200000.

Если вы используете struct вместо union, у вас будет место для int и bool, а не просто int, и вы увидите ожидаемые результаты.

3 голосов
/ 19 мая 2010

Союз хранит только один членов в любой момент времени. Чтобы получить определенные результаты, вы можете прочитать только тот же элемент из объединения, которое в последний раз было записано в объединения. В противном случае (как вы здесь) официально не дает ничего более или менее неопределенного результата.

Иногда союзы преднамеренно используются для определения типа (например, просмотр байтов, составляющих число с плавающей запятой). В этом случае вам решать, что вы получаете. Язык пытается дать вам шанс на борьбу, но на самом деле он не может многое гарантировать.

3 голосов
/ 19 мая 2010

В объединении все члены данных начинаются в одной и той же ячейке памяти.В вашем примере вы действительно можете использовать только один элемент данных за раз.Однако эту функцию можно использовать для некоторых хитрых уловок, таких как показ одних и тех же данных несколькими способами:

union Vector3
{
  int v[3];
  struct
  {
    int x, y, z;
  };
};

, который позволяет получить доступ к трем целым числам либо по имени (x, y и z), либо какмассив (v).

1 голос
/ 11 февраля 2011

Объединение в C облегчает разделение пространства памяти другой переменной.
Поэтому, когда вы изменяете любую переменную внутри объединения, это также влияет на значения всех остальных переменных.

...