Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Конспект лекций -=Вычислительная техника и прог...docx
Скачиваний:
11
Добавлен:
01.05.2025
Размер:
2 Мб
Скачать
☆

4.3.4. Битовые поля

Битовые поля — это особый вид полей структуры.

Битовые поля используются для плотной упаковки данных, например флагов.

Флаг — признак того или иного события в программе, операционной системе (ОС) или аппаратной части ПК.

Примечания:

— минимальная адресуемая ячейка памяти — 1 Байт;

— минимальный размер поля — 1 Бит;

— битовые поля могут быть любого целого типа;

— адрес поля получить нельзя.

При описании битового поля его длина в Битах указывается через знак : (двоеточие).

Пример:

struct DialogOptions

{

bool centerX : 1 ; // через двоеточие

bool centerY : 1 ; // указана длина полей

unsigned int shadow : 2 ; // в Битах

unsigned int palette : 4 ;

} ;

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

Объединение union — это частный случай структуры.

Примечания:

— все поля объединения располагаются по одному адресу;

— в каждый момент времени в переменной типа объединение хранится только одно значение;

— длина объединения равна длине наибольшего поля;

— объединения применяются для экономии памяти, когда известно, что более одного поля одновременно в программе не потребуется.

Формат записи объединения аналогичен формату структур:

union [ имя_типа ]

{

тип_1 элемент_1 ;

тип_2 элемент_2 ;

…

тип_N элемент_N ;

} [ список_описателей ] ;

Пример:

/* Фрагмент программы кассового аппарата. Вариант 1. */

#include <iostream.h>

int main()

{ enum PayType {CARD, CASH} ;

PayType ptype;

union payment

{

char card[25] ;

long cash ;

} info ;

…

/* Подпрограмма присваивания значений

переменных info и ptype */

…

switch (ptype) { // Вывод информации об оплате на экран

case CARD : cout << ''Оплата по карте : ''

<< info.card ;   break ;

case CASH : cout << ''Оплата наличными : ''

<< info.cash ;  break ;

}

return 0;

}

Union часто используют в качестве поля в struct, как показано в следующем примере.

Пример:

/* Фрагмент программы кассового аппарата. Вариант 2. */

#include <iostream.h>

int main()

{ enum PayType {CARD, CASH} ;

struct {

PayType ptype ;

union { char card[25]; long cash; }

} info;

…

/* Подпрограмма присваивания значений переменных info */

…

switch (info.ptype) { // Вывод информации об оплате на экран

case CARD : cout << ''Оплата по карте : ''

<< info.card ;   break ;

case CASH : cout << ''Оплата наличными : ''

<< info.cash ;  break ;

}

return 0;

}

Примечания:

Существует несколько ограничений:

— объединение может инициализироваться только значением его первого элемента;

— объединение не может содержать битовые поля, но может содержать структуры битовых полей (см. пример).

Пример:

struct DialogOptions

{

bool centerX : 1;

bool centerY : 1;

unsigned int shadow : 2 ;

unsigned int palette : 4 ;

}

union {

unsigned char ch ;

DialogOptions bit ;

} options = {0xC4} ;

cout<<options.bit.palette ;

options.ch &= 0xF0 ; // <– – наложение маски