Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Подбельский Фомин_Программирование на языке СИ_...doc
Скачиваний:
356
Добавлен:
10.08.2019
Размер:
53.81 Mб
Скачать

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

Битовые поля. Битовое поле может быть только элементом структуры или объединения и вне объектов этих типов не встречается. Битовые поля не имеют адресов и не могут объединяться в массивы. Назначение битовых полей - обеспечить удобный доступ к отдельным битам данных. Кроме того, с помощью битовых полей можно формировать объекты с длиной внутреннего представления, не кратной байту. Это позволяет плотно "упаковывать" информацию, что экономит память.

Описание структуры с битовыми полями должно иметь такой формат:

struct { тип_1 имя_поля_1 : ширина_поля_1;

тип_2 имя_поля_2 : ширина_поля_2;

} имя структуры ;

где mun_i - тип поля, который может быть только int, возможно, со спецификатором unsigned или signed;

ширина_поля - целое неотрицательное десятичное число, значение которого обычно (в зависимости от реализации компилятора) не должно превышать длины слова конкретной ЭВМ.

Разрешается поле без имени (для чего указываются только двоеточие и ширина), с помощью которого в структуру вводятся неиспользуемые биты (промежуток между значимыми полями). Нулевая ширина поля вводится, когда необходимо, чтобы следующее в данной структуре поле разместилось с начала очередного слова конкретной ЭВМ.

Вместо служебного слова struct может употребляться union. В этом случае определяется объединение с битовыми полями.

Для обращения к полям используются те же конструкции, что и для обращения к обычным элементам структур:

имя структуры. имя_поля_1

(* указатель _на_структуру). имя_поля_1

указателъ_на_структуру -> имя_поля_1

Например, для структуры хх с битовыми полями:

правомочны такие операторы:

От реализации зависит порядок размещения в памяти полей одной структуры. Поля могут размещаться как слева направо, так и справа налево. Для компиляторов, работающих под управлением MS-DOS на IBM PC, поля, которые размещены в начале описания структуры, имеют младшие адреса. Таким образом, для примера:

в одном байте формируется последовательность битов, приведенная на рис. 6.5.

Рис. 6.5. Размещение битовых полей в байте

В качестве иллюстрации возможностей объединений и структур с битовыми полями рассмотрим следующую программу. В ней вводятся значения двух целых переменных m и n остатки от их деления на 16 заносятся соответственно в четыре младших и четыре старших разряда одного байта. Таким образом выполняется некоторая кодировка введенных значений переменных тип. Затем печатается изображение содержимого сформированного байта. Особенности программы объяснены в комментариях и поясняются результатами выполнения. Обратите внимание на использование объединений. В функции cod( ) запись данных производится в элементы (битовые поля) структуры hh, входящей в объединение un, а результат выбирается из того же объединения un в виде одного байта. В функции binar( ) происходит обратное преобразование - в нее как значение параметра передается байт, содержимое которого побитово "расшифровывается" за счет обращения к отдельным полям структуры byte, входящей в объединение cod.

Текст программы:

Результаты выполнения программы на IBM PC: Первый вариант: