Доступ до окремого біту

У мові Сі визначено ще один тип для розміщення в пам'яті кількох змінних різного типу. Це - об'єднання. Оголошується об'єднання так само, як і структура, наприклад:

Це об'єднання не задає якусь змінну. Воно задає шаблон об'єднання.

Можна оголосити змінну:

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

Тепер для визначення змінної можна використовувати

Схожі статті