Объединения.

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

 

Размер объединения равен максимальной из длин его полей.

Описание объединения напоминает описание структуры:

union [имя типа] {описание полей} [список имён] ;

Список имён может содержать имена переменных, указатели,массивы.

Имя типа указывать необязательно,тогда надо указать элемент(ы) в списке имён. Можно указать и то и другое.

Пример.

union ch // ch - имя типа {double x; сhar s[8]; };   union // имени типа нет {double x; сhar s[8]; }q; //переменная q-объединение  

Если введён тип, то можно определять (аналогично структурам):

ch v,w[4]; //переменные, массивы

ch *pch; //указатели

Обращение к элементу объединения:

Имя_объединения . имя_элемента

Указатель на объединение -> имя_элемента

*( Указатель на объединение). имя элемента

 

Примеры: v.x v.s[i] pch->x *(pch).x

Занести значение в объединение можно присвоив его элементу это значение: q.x=1.57E-2;

Назначение объединения-обеспечить возможность доступа к одному и тому же участку памяти с помощью разных типов. Это позволяет, например, задав значение вещественного числа x, посмотреть (и вывести) содержимое его отдельных байтов s[i], и таким образом получить внутреннее представление вещественного x. Для вещественного данного такой доступ к отдельным байтам невозможен.

 

//Внутреннее представление вещественных данных

#include <iostream>

#include <iomanip>

using namespace std;

 

typedef double tip; // рассматриваемый тип обозначим tip

const int L=sizeof(tip); // размер типа в байтах

union {

tip a;

unsigned char u[L];

}q; // q- включает вещ.данное и массив

//байтов размера, равного размеру типа tip

// здесь необходимо учитывать, что значение a в памяти хранится

//в перевёрнутом виде: от младшего байта к старшему,

//внутренность байта не переворачивается.

//Байты строки u в памяти хранятся в порядке u[0],u[1],…u[L-1]

//т.е. u[0]наложится на младший байт a,…u[L-1] на старший байт

//a, поэтому вывод надо начинать с u[L-1], затем u[L-2],… ,u[0], либо строку S формировать с конца.

 

void binkod (tip n, char s[])

{//функция формирует строку s с двоичным представлением //вещественного данного n.