Язык Си допускает использование в структурах особого типа полей – битовых. Их использование дает возможность доступа к отдельным битам более крупных объектов (байтов, слов). Битовое поле (или поле битов) может быть объявлено только как компонент структуры по форме:
тип имя: ширина; где
тип – спецификатор целого типа (int – знаковый, unsigned –б еззнаковый);
имя – название поля, которое может быть опущено;
ширина – размер поля в битах.
Если имя поля опущено, запрошенные биты выделяются, но доступ к ним невозможен. Эти поля используются для выравнивания. Неименованное поле с нулевой шириной (размером) означает, что память следующего элемента объявления будет начинаться на границе типа int.
Битовые поля в структуре описываются от младших разрядов к старшим. В знаковых полях типа int старший бит используется для хранения знака. Например, такое поле шириной 1 бит может содержать только значения 0 и –1, так как любая ненулевая величина будет интерпретироваться как –1.
Пример. Рассмотрим работу программы по обработке битовых полей структуры my_struct, описывающей машинное слово из двух байтов.
Программа:
#include<stdio.h>
#include<conio.h>
void main()
{ struct example { /* описание структуры с битовыми полями */
int i: 2; /* младшие разряды слова */
unsigned j: 2; /* беззнаковое поле */
int: 2; /* неименованное поле */
int k: 2; /* знаковое поле */
int dummy: 8; /* старшие разряды слова */
} my_struct; /* структурная переменная */
clrscr(); /* очистка экрана */
my_struct.dummy = 0; /* заполнение полей структуры */
my_struct.i = 1;
my_struct.j = 3;
my_struct.k = -1;
printf(“Значение структурной переменной (16-чное) = %x\n”,
my_struct);
printf(“Отдельные поля: i=%d j=%d k=%d\n”,
my_struct.i, my_struct.j, my_struct.k);
}
Результаты программы:
Значение структурной переменной (16-чное) = ed
Отдельные поля: i=1 j=3 k=-1
Первое число получено в результате распечатки значения в 16-чной системе счисления, выделенного под структурную переменную my_struct. Если представить это число в двоичной системе счисления и наложить битовые поля, получим расположение битовых полей, приведенное на схеме ниже. К пустому полю доступ отсутствует.
Схема структурной переменной my_struct:
Биты: | 15…8 | 7 6 | 5 4 | 3 2 | 1 0 |
Значения: | 0…0 | 1 1 | 1 1 | 0 1 | |
Имя поля: | dummy | k | j | i |