Объявление битовых полей
Элементом структуры может быть битовое поле, обеспечивающее доступ к отдельным битам памяти. Вне структур или объединений битовые поля объявлять нельзя. Нельзя также организовывать массивы битовых полей и нельзя применять к полям операцию определения адреса или получить ссылку на них.
Синтаксис объявления типа структуры с битовыми полями:
struct [ИмяСтруктуры] { Тип1 ИмяПоля1 : ШиринаПоля1
Тип2 ИмяПоля2 : ШиринаПоля2
........................
ТипN ИмяПоляN : ШиринаПоляN
} ИмяСтруктуры;
где struct – спецификатор типа;
ИмяСтруктуры – идентификатор;
Тип1, ... ТипN – тип поля, который может быть только int, возможно, со спецификатором unsigned или signed;
ИмяПоля – идентификатор поля;
ШиринаПоля (длина) – целое неотрицательное десятичное число, значение которого обычно (в зависимости от реализации компилятора) не должно превышать длины машинного слова.
Например:
struct {
int c1 : 4;
int c2 : 12;
} ab;
Битовые поля длиной 1 должны объявляться как unsigned, поскольку 1 бит не может иметь знака. Битовые поля могут иметь длину от 1 до 16 бит для 16-битных сред и от 1 до 32 бит для 32-битных сред.
Разрешается поле без имени (для этого надо указать только двоеточие и ширину), с помощью которого в структуру вводятся неиспользуемые биты (промежуток между значимыми полями). Нулевая ширина поля вводится, когда необходимо, чтобы следующее в данной структуре поле разместилось с начала очередного машинного слова.
Например, если нам нужны только биты cts и dsr, то можно объявить структуру status_type следующим образом:
struct status_type {
unsigned : 4;
unsigned cts :1;
unsigned dsr :4;
} status;
В структуре можно смешивать «обычные» элементы с битовыми полями.
Например:
struct emp {
struct addr address;
float pay;
unsigned lay_off: 1; //работает или нет
unsigned hourly: 1;//почасовая оплата или оклад
unsigned deductions : 3; //удержание налога
};
Эта структура определяет запись по каждому служащему, в которой используется только один байт для хранения трех элементов информации: статус служащего, характер оплаты его труда и налоговая ставка. Без использования битовых полей для хранения этой информации пришлось бы занять три байта.
Вместо служебного слова struct можно употреблять union. В этом случае определяется объединение с битовыми полями. Битовые поля в объединениях используются для доступа к нужным битам того или иного объекта, входящего в объединение.
Пример 1. В программе объединение позволяет сформировать код символа 'D' (равный 68):
#include <iostream.h>
union { char simb;
struct { int x:5;
int y:3;
} hh;
} cod;
void main() {
cod.hh.x = 4;
cod.hh.y = 2;
cout << cod.simb; // выводит на экран символ 'D'
}
Дата добавления: 2015-02-16; просмотров: 579;