У мові Сі визначено ще один тип для розміщення в пам'яті кількох змінних різного типу. Це - об'єднання. Оголошується об'єднання так само, як і структура, наприклад:
Це об'єднання не задає якусь змінну. Воно задає шаблон об'єднання.
Можна оголосити змінну:
union u alfa, beta;
Можна було оголосити змінні одночасно із завданням шаблону. На відміну від структури для змінної типу union місця в пам'яті виділяється рівно стільки, скільки треба елементу об'єднання, що має найбільший розмір в байтах. Так під змінну alfa буде виділено чотири байти, під змінну i - 2 байта; під змінну ch - 1 байт; під змінну l - 4 байта;
Синтаксис використання елементів об'єднання такої ж, як і для структур:
Для об'єднання дозволена також операція ->, якщо ми звертаємося до об'єднання за допомогою покажчика.
6.3. бітові поля
Структура може містити бітові поля. Цілі компоненти типу signed і unsigned можна оголосити бітовими полями шириною від 1 до 16 бітів. Ширина бітового поля і його необов'язковий ідентифікатор задаються наступним чином:
тип <идентификатор>: Ширина;
де тип - це char, unsigned char, int або unsigned int.
Якщо ідентифікатор бітового поля опущений, то число бітів, заданий виразом ширина, розподіляється в пам'яті, але поле при цьому залишається недоступним програмі. Якщо при цьому значення ширина дорівнює нулю, то наступне поле буде починатися з наступного слова пам'яті.
Для зазначених в структурі полів задається наступний розподіл пам'яті:
15 14 12 11 10 9 8 7 6 5 4 3 2 1 0
x x x x x x x x x x x x x x x
Цілі поля зберігаються у вигляді доповнення до 2, причому крайній лівий біт є старшим. Для бітового поля типу int (наприклад, signed) старший біт інтерпретується як знаковий. Наприклад, поле k типу signed int шириною 1 може містити тільки значення -1 і 0, так як бітової шаблон 1 буде інтерпретуватися як -1.
Результат роботи програми: -1.
На відміну від інших мов програмування мова Сі забезпечує доступ до одного або кількох бітів в байті або слові. Це має свої переваги. Якщо багато змінні приймають тільки два значення, (такі змінні називають прапорами), то можна використовувати 1 біт.
struct імя_ структури
тип ім'я 1: довжина в бітах;
тип ім'я 2: довжина в бітах;
тип ім'я N: довжина в бітах;
unsigned one_bit. 1;
то для зміною obj буде виділено 8 біт, але використовуватися буде тільки перший.
6.5. Перейменування типів - typedef
Мова Сі за допомогою оператора typedef дозволяє задавати нове ім'я вже існуючим змінним. При цьому не створюється новий тип даних.
typedef char SIMBOL;
typedef unsigned UNSIGN;
typedef float real;
Досить часто використовується оператор typedef із застосуванням структур:
typedef struct st_tag
Тепер для визначення змінної можна використовувати