Об'єднання

Бітові поля

Елементом структури може бути бітове поле, що забезпечує доступ до окремих бітів пам'яті. Поза структурами бітові поля використовувати не можна.

Бітові поля - це особливий вид полів структури. Вони використовуються для щільного упакування даних, наприклад, прапорців типу "так/ні". Найменьша по довжині комірка пам'яті, яку можна адресувати - 1 байт, а для збереження прапорця досить одного біта.

При описі бітового поля після імені через двокрапку вказується довжина поля в бітах, що задається цілим виразом або константою. Поле нульової довжини означає вирівнювання на границю наступного слова.

Допускаються неіменовані поля бітів. Вони не впливають на зміст іменованих полів, але певним чином можуть поліпшувати розміщення полів в пам'яті.

Структури бітових полів можуть містити і знакові елементи. Але, навіть цілі поля можуть розглядатись як беззнакові. Тому рекомендується описувати бітові поля як unsіgned.

В пам'яті бітові поля розміщуються на відповідних границях слів, при цьому деякі біти слів можуть залишатись невикористаними. Поле, яке не можна розмістити у місце, що залишилося до границі слова, розміщується в наступне слово. Поле не може бути ширшим за слово. На деяких машинах бітові поля розміщуються справа наліво, а на деяких – зліва направо.

 

Приклад 11.

struct {

unsigned t : 1;

unsigned p : 3;

unsigned : 1; // не використовується

unsigned m : 4;

unsigned : 0; // вирівнювання на границю наступного слова

unsigned a : 1;

} rec = {1,3,8,1};

Приймемо, що бітові поля розміщуються справа наліво. В пам'яті бітові поля структури rec розміщуються за такою схемою:

 

     
m - p t   вирівнювання m   на границю   наступного слова

 

     
вирівнювання a   на   границю   слова

 

Отже, структура rec в пам’яті комп’ютера зберігається у 8 байтах в такому вигляді:

07 01 00 00 01 00 00 00

 

Однак застосування полів для зберігання декількох змінних в одному байті не обов'язково економить простір. Воно економить простір, який займають дані, але розмір коду, необхідного для роботи з цими змінними, на більшості машин зростає. Відомі програми, які значно стискались, коли двійкові змінні перетворювали з полів біт у символи. Крім того, доступ до char або іnt зазвичай набагато швидший, ніж доступ до бітових полів. Поля - це просто зручний і короткий запис для застосування логічних операцій з метою отримання інформації із частини слова або введення інформації в неї.

Об'єднання дуже схожі на структури. Однак на відміну від структури об'єднання зберігає значення тільки одного елемента в кожний момент часу. Інакше кажучи, коли виконується операція присвоювання значення елементу об'єднання, то перезаписується будь-яке попереднє присвоювання.

Головною особливістю об'єднання є те, що для кожного з оголошених елементів виділяється та сама область пам'яті, тобто вони перекриваються. Пам'ять, що відповідає змінній типу об'єднання, визначається величиною, необхідною для розміщення найбільш довгого елемента об'єднання. Коли використовується елемент меншої довжини, то змінна типу об'єднання може містити зайву пам'ять, що не використовується. Всі елементи об'єднання зберігаються в одній і тій cамій області пам'яті, починаючи з однієї адреси.

 

Приклад 12.

union {

char chx;

short kx;

float fx;

} u;

u . fx = 4.1;

u . kx = 123;

u . chx = 'K' ;

 

Визначимо представлення в пам'яті комп’ютера окремо кожного елемента об'єднання:

 

1). Представлення дійсної змінної типу float : u . fx = 4.1;

4,1 10 = 4,1(9) 16 = 0100 , 0001 (1001) 2

 

Нормалізація:

01, 00 0001 1001 1001 1001 1001 1001 * 20010

Мантиса:

m = 00 0001 1001 1001 1001 1001 1

Зміщений порядок:

е = 12710 + 210 = 129 10 = 81 16 = 1000 0001 2

Знак: s = 0

 

Зборка за схемою:

 

1біт 8 біт 23 біта
s e m
1000 0001 00 0001 1001 1001 1001 1001 1

 

В пам’яті комп’ютера буде зберігатися у зворотному порядку розміщення байт числа.

Результат в 16- ковій системі числення: 33 33 83 40

 

2). Представлення короткого цілого числа типу short : u.kx = 123;

Додатнє число 123 типу short в пам'яті комп’ютера зберігається в прямому двійковому коді і займає 2 байта: 12310 = 7B16 = 0111 1011 2 0000 0000 0111 1011

 

В пам’яті комп’ютера цілі числа зберігаються у зворотному порядку розміщення байт числа:

0111 1011 0000 0000

Результат в 16-ковій системі числення: 7B 00

3). Представлення символьної змінної типу char : u . chx = 'K' ;

За системою ASCIІ: символ ’9’ має порядковий номер 7510 = 4B16 = 0001 10112

Отже, цей символ в пам’яті комп’ютера буде представлений як послідовність 0001 1011.

В 16-ковій системі числення: 4B

 

Величиною, необхідною для розміщення найбільш довгого елемента об'єднання є змінна типу float, під яку виділяється 4 байта.

 

Після виконання першої операції присвоєння u . fx = 4.1 в цих 4 байтах пам’яті в 16- ковій системі числення буде записана така послідовність: 33 33 83 40

 

Після виконання другої операції присвоєння u . kx = 123 перші 2 байта пам’яті будуть переписані і в результаті в пам’яті в 16- ковій системі числення буде записана така послідовність: 7B 0083 40

 

Після виконання третьої операції присвоєння u . chx = 'K' перший байт пам’яті буде переписаний і в результаті в пам’яті в 16- ковій системі числення буде записана така послідовність: 4B00 83 40

 

В результаті, об'єднання в пам’яті комп’ютера буде зберігатись у 4 байтах в такому вигляді:

4B 00 83 40