При дефиците памяти может возникнуть необходимость запаковать несколько объектов в одно слово машины. Одна из обычных ситуаций – это объединение групп однобитовых флажков. Битовое поле может быть только элементом структуры или объединения и вне этих объектов не встречается. Назначение битовых полей – обеспечить удобный доступ к отдельным битам данных. С помощью битовых полей можно формировать объекты с длиной внутреннего представления не кратной байту. Битовые поля не имеют адресов и не могут объединяться в массивы.
Битовые поля полезны по следующим причинам:
1. Если ограничено место для хранения информации, можно сохранить несколько логических переменных в одном байте.
2. Некоторые интерфейсы передают информацию, закодировав биты в один байт.
3. Некоторым процедурам кодирования необходимо получить доступ к отдельным битам в байте.
Описание структуры с битовыми полями имеет следующий формат:
struct {
<тип 1> <имя поля 1>:<ширина поля 1>;
<тип 2> <имя поля 2>:<ширина поля 2>;
. . .
} <имя структуры>;
где <тип i> - тип поля, который может быть только int (signed или unsigned);
<ширина поля i> - целое неотрицательное десятичное число, не превышающее разрядности слова конкретной ЭВМ.
Разрешается не указывать имени поля, что означает пропуск (неиспользование) соответствующего указанной ширине количества бит. Нулевая длина вводится, когда необходимо, чтобы следующее поле разместилось с начала очередного слова конкретной ЭВМ.
Вместо struct может употребляться union.
Для обращения к полям используются те же конструкции, что и для обращения к обычным элементам структур:
<имя структуры>.<имя поля i>
(*<указатель на структуру>).<имя поля i>
<указатель на структуру> -> <имя поля i>
Нельзя получить адрес переменной битового поля. Переменные битового поля не могут помещаться в массив. Переходя с компьютера на компьютер нельзя быть уверенным в порядке изменения битов (слева на право или справо налево). Любая программа использует битовые поля и зависит от компьютера. Можно смешивать различные структурные переменные в битовых полях.
Попытка присвоить нецелое значение, либо значение, слишком большое для указанного поля, приведет к возникновению ошибки. Обычно оказывается полезным определить массив символических констант для всевозможных значений битового поля и использовать введенные символические имена.