Выбрать главу

  else cout << "0 ";

}

При выполнении программа генерирует такие результаты.

Исходные байты: 0000 0000 0000 1111

Байты после перестановки: 0000 1111 0000 0000

В этой программе целочисленной переменной sb.num присваивается число 15. Перестановка двух байтов, составляющих это значение, выполняется путем обмена двух символов, которые образуют массив ch. В результате старший и младший байты целочисленной переменной num меняются местами. Эта операция возможна лишь потому, что как переменная num, так и массив ch разделяют одну и ту же область памяти.

В следующей программе демонстрируется еще один пример использования объединения. Здесь объединения связываются с битовыми полями, используемыми для отображения в двоичной системе счисления ASCII-кода, генерируемого при нажатии любой клавиши. Эта программа также демонстрирует альтернативный способ отображения отдельных битов, составляющих байт. Объединение позволяет присвоить значение нажатой клавиши символьной переменной, а битовые поля используются для отображения отдельных битов.

// Отображение ASCII-кода символов в двоичной системе счисления.

#include <iostream>

#include <conio.h>

using namespace std;

// Битовые поля, которые будут расшифрованы.

struct byte {

 unsigned a : 1;

 unsigned b : 1;

 unsigned с : 1;

 unsigned d : 1;

 unsigned e : 1;

 unsigned f : 1;

 unsigned g : 1;

 unsigned h : 1;

};

union bits {

 char ch;

 struct byte bit;

}ascii;

void disp_bits(bits b);

int main()

{

 do {

  cin >> ascii.ch;

  cout << ":";

  disp_bits(ascii);

 }while(ascii.ch!='q'); // Выход при вводе буквы "q".

 return 0;

}

// Отображение конфигурации битов для каждого символа.

void disp_bits(bits b)

{

 if(b.bit.h) cout << "1";

  else cout << "0";

 if(b.bit.g) cout << "1";

  else cout << "0";

 if(b.bit.f) cout << "1";

  else cout << "0 ";

 if(b.bit.e) cout << "1";

  else cout << "0";

 if(b.bit.d) cout << "1";

  else cout << "0";

 if(b.bit.c) cout << "1";

  else cout << "0";

 if(b.bit.b) cout << "1";

  else cout << "0";

 if(b.bit.a) cout << "1";

  else cout << "0";

 cout << "\n";

}

Вот как выглядит один из возможных вариантов выполнения этой программы.

а: 0 1 1 0 0 0 0 1

b: 0 1 1 0 0 0 1 0

с: 0 1 1 0 0 0 1 1

d: 0 1 1 0 0 1 0 0

е: 0 1 1 0 0 1 0 1

f: 0 1 1 0 0 1 1 0

g: 0 1 1 0 0 1 1 1

h: 0 1 1 0 1 0 0 0

i: 0 1 1 0 1 0 0 1

j: 0 1 1 0 1 0 1 0

k: 0 1 1 0 1 0 1 1

1: 0 1 1 0 1 1 0 0

m: 0 1 1 0 1 1 0 1

n: 0 1 1 0 1 1 1 0

o: 0 1 1 0 1 1 1 1

p: 0 1 1 1 0 0 0 0

q: 0 1 1 1 0 0 0 1

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

Анонимные объединения