Структуру можно использовать для обеспечения доступа к отдельным битам слова при помощи битовых полей.
Использовать битовые поля можно при разработке программ, в которых важно экономить память, или системных программ, прямо взаимодействующих с оборудованием, в частности при написании драйверов устройств может понадобиться доступ к конкретным битам регистра устройства.
Целые компоненты структуры можно объявить битовыми полями шириной от 1 до 16 битов.
Битовое поле задается следующим образом:
тип <имя поля>: ширина;
где тип - это char, unsigned char, int или unsigned int.
Если имя битового поля опущено, то число битов, заданное выражением ширина, распределяется в памяти, но поле при этом остается недоступным программе. Если при этом значение ширина равно нулю, то следующее поле будет начинаться со следующего слова памяти.
Пример:
struct str {
int i: 3;
unsigned j: 4;
int: 4
int k: 2;
} a;
Для указанных в структуре полей задается следующее распределение памяти:
15 14 12 11 10 9 8 7 6 5 4 3 2 1 0
x x x x x x x x x x x x x x x
|
|
< -- > < -------- > < -------- > < ---- >
k не испол. j i
Целые поля хранятся в виде дополнения до 2, причем крайний левый бит является старшим. Для битового поля типа int (например, signed) старший бит интерпретируется как знаковый. Например, поле k типа signed int шириной 1 может содержать только значения –1 и 0, так как битовой шаблон 1 будет интерпретироваться как -1.
Пример:
#include<stdio.h>
void main (void)
{
struct str {
int i:1;
unsigned int j:4;
int l:4;
int k:2;
} a;
a.i=1;
printf(“%d”,a.i);
}
Результат работы программы: -1.