Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
шпори частина 2.docx
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
656.84 Кб
Скачать
  1. Структури з бітовими полями. Оголошення та ініціалізація. Обробка.

Мовам С має можливість, яка називається бітовими полями, що дозволяє працювати з окремими бітами. Бітові поля корисні з кількох причин:

  • Якщо обмежено місце для зберігання інформації, можна зберегти кілька логічних (істина / неправда) змінних в одному байті.

  • Деякі інтерфейси пристроїв передають інформацію, закодувавши біти в один байт.

  • Деяким процедурам кодування необхідно отримати доступ до окремих бітам в байті.

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

Метод використання бітових полів для доступу до біт заснований на структурах.

Бітове поле, насправді, - це просто особливий тип структури, що визначає, яку довжину має кожний член. Стандартний вигляд оголошення бітових полів наступний:

struct ім'я структури {

тип імя1: довжина;

тип імя2: довжина;

...

тип імяN: довжина;

}

Бітові поля повинні оголошуватися як int, unsigned або signed. Бітові поля довжиною 1 повинні оголошуватися як unsigned, оскільки 1 біт не може мати знака. Бітові поля можуть мати довжину від 1 до16 біт для 16-бітних середовищ і від 1 до 32 біт для 32-бітних середовищ.

Розглянемо наведене нижче визначення структури:

struct device {

unsigned active: 1;

unsigned ready: 1;

unsigned xmt_error: 1;

} Dev_code;

Дана структура визначає три змінні по одному біту кожна. Структурна змінна dev_code може, наприклад, використовуватися для декодування інформації з порту стрічкового накопичувача. Для такого гіпотетичного стрічкового накопичувача наступний фрагмент коду записує байт інформації на стрічку і перевіряє на помилки, використовуючи dev_code:void wr_tape (char с)

{

while (! dev_code.ready) rd (& dev_code); / * Чекати * /

wr_to__tape (с); / * Запис байта * /

while (dev_code.active) rd (& dev_code); / * Очікування закінчення запису інформації * /

if (dev_code.xmt error) printf ("Write Error");

}

Тут rd () повертає статус стрічкового накопичувача wr_to_tape (), записує дані. Малюнок показує, як виглядає змінна dev_code в пам'яті.

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

Немає необхідності обзивати кожне бітове поле. До полю, що має назву, легше отримати доступ. Наприклад, якщо стрічковий накопичувач повертає інформацію, про настання кінця стрічки в п'ятому біті, слід змінити структуру device наступним чином:

struct device {

unsigned active: 1;

unsigned ready: 1;

unsigned xmt_error: 1;

unsigned: 2;

unsigned EOT: 1;

} Dev_code;

Бітові поля мають деякі обмеження.

  • Не можна отримати адресу змінної бітового поля.

  • Змінні бітового поля не можуть поміщатися в масив.

  • Переходячи з комп'ютера на комп'ютер не можна бути впевненим у порядку зміни бітів (зліва направо або справа наліво).

  • Будь-який код, який використовує бітові поля, залежить від комп'ютера.

Нарешті, можна змішувати різні структурні змінні в бітових полях. Наприклад:

struct emp {

struct addr address;

float pay;

unsigned lay_off: 1;

unsigned hourly: 1;

unsigned deductions: 3;

};

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

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]