Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Программирование / WORD / Лекции по ЯП (часть 3).doc
Скачиваний:
138
Добавлен:
15.04.2015
Размер:
1.34 Mб
Скачать

Битовые поля в структурах

Битовое поле — это элемент структуры, состоящий из заданного количества битов. Можно объявить битовое поле, состоящее из одного бита, двух битов или любого их количества, необходимого для хранения данных.

Реальное приложение на практике:

- для кодирования каких-то ситуаций, например «Да» - 1, «Нет» - 0. Достаточно одного бита.

- «За», «Против», «Воздержался» или не принимал участия в голосовании – достаточно 2-х бит и т.д.

Основная форма объявления такой структуры следующая:

struct имя_структуры {

тип имя1 : длина_в_битах;

тип имя2 : длина_в_битах; направление возрастания адресов

. . .

тип имяN : длина_в битах;

};

В этом объявлении структуры тип может быть одним из следующих: int, unsigned или signed. Чаще всего unsigned. Если имена не используются, то их можно не указывать.

Длина структуры всегда кратна восьми. Так, если указать

struct onebit{

unsigned one_bit: 1;

} obj;

To для переменной obj будет выделено 8 бит, но использоваться будет только первый.

В структуре могут быть смешаны обычные переменные и поля битов.

Объединения

Объединения (unions) внешне похожи на структуры. Объединение объявляется и используется аналогичным образом. В отличие от структуры, всякий раз только один из элементов объединения доступен для обращения. Причина этого проста — все элементы объединения занимают одну и ту же область памяти, как бы располагаясь один поверх другого. В отличие от структуры для переменной типа union места в памяти выде­ляется ровно столько, сколько надо элементу объединения, имеющему наибольший размер в байтах.

Аналог объединения на Паскале – вариантная запись, где под вариантные поля выделена одна и та же область памяти.

Турбо Паскаль

Турбо Си

Var

a:record

case boolean of

true :(b:char);

false:(c:integer);

end;

union имя_объединения

{

char b;

int c;

} a;

Замечания:

Довольно часто необходимо использовать одну и ту же область памяти для хранения значений разных типов. Это может потребоваться, например, для следующих целей:

  • минимизация используемого объема памяти, если в каждый момент времени только один объект из многих является активным;

  • интерпретация основного представления объекта одного типа как если бы этому объекту был назначен другой тип.

Для этих целей предусмотрен тип union, имеющий следующие формы записи:

union имя_обьединения

{

член(ы)_ объединения;

} имя_переменной;

union имя_обьединения

{

член(ы)_ объединения;

};

union имя_обьединения имя_переменной;

typedef

union

{

член(ы)_ объединения;

} синоним_типа;

синоним_типа имя_переменной;

Обращение к элементам объединения

Обращение к отдельным полям объединения выполняется так же, как к полям структуры: с помощью точки (.). Однако есть и существенное различие. Обращаться всякий раз можно только к одному элементу объединения, поскольку элементы хранятся один поверх другого.

Для объединений также разрешена операция ->, если мы обращаемся к объединению с помощью указателя.

При объявлении объединения его можно инициализировать. Раз уж только один элемент объединения может использоваться при каждом обращении к нему, то и инициализировать нужно только один элемент.