Учебное пособие Самара 2015 + 004. 43 Ббк 32. 973 Н 19
Download 1.98 Mb.
|
Lekcii AiSD 2015
Битовые поля
Структуры могут содержать битовые поля последователь- ности двоичных разрядов внутри одного целого значения. Язык С++ позволяет использовать любой целый тип . Будет он знако- вым или беззнаковым, зависит от реализации компилятора, так же как и порядок размещения битовых полей в машинном слове. Именно поэтому битовые поля имеют имена, для обеспечения не- зависимости от машинной реализации. Приведём пример струк- турного типа, содержащего битовые поля. struct kilo int a:2; unsigned b:3; int :5 // не используется int c:1: unsigned d:5: Состав этих полей показан на рисунке 5.1.
Рис. 5.1 — Состав битовых полей 62 Для битового поля можно явно определить тип siqned или uns iqned. В битовом поле типа siqned крайний левый бит яв- ляется знаковым. Такое поле шириной в 1 бит может хранить значения только 0 или —1. Битовое поле без имени просто резервирует указанное число разрядов. Битовое поле без имени с нулевым размером указывает, что следующее битовое поле начинается на границе машинного CMOBd. Доступ к битовому полю производится также как к компо- ненту структуры. kilo ssc; ssc.a 1; Битовые поля используются для упаковки значений не- скольких переменных в одно машинное слово с целью экономии памяти, отводимой под данные, но это увеличивает размер ис- полняемого кода для доступа к этим данным и снижает произво- дительность программы. Битовые поля позволяют также выполнять преобразование данных в другие форматы. Битовые поля не могут быть массивами и не имеют адресов, поэтому к ним нельзя применить операцию получения адреса &, на них не может быть указателей и ссылок. Можно получить ад- pec структуры, содержащей битовые поля. Объединения Объединение — это некоторая переменная, которая может хранить в разное время объекты различных типа и размера. Такая переменная имеет размер, достаточный для размещения наи- большего из своих полей. Объединения объявляются при помощи служебного слова uni оп. uni оп гстео int ir; double fr; char ch; 63 Объединения могут иметь (и обычно имеют) имя, которое становится идентификатором типа, в противном случае объеди- нения являются анонимными. К полям анонимных объединений можно обращаться так же, как если бы они были самостоятель- ными переменными. Глобальные анонимные объединения долж- ны быть объявлены как статические. romeo zulu; zulu . ir = 15; // обращение к полю (не инициализация) Статические объединения могут быть инициализированы значениями в фигурных скобках, причём инициализировано мо- жет быть лишь первое поле. romeo zulu = {15}; // нннциалнзацня romeo zulu = {’F’}; / неправильно, т.к. первое поле нмееттнпіпt, а несhаг Статические массивы объединений также могут быть ини- циализированы romeo х ray[ ] = {3,5,7}; Могут существовать указатели romeo *mike; и ссылки на объединения: romeo& foxtrot = zulu; Доступ к объединениям через ссылку foxtrot. fr = через указатель (*mike).ir = ... или mike—>ch = Если поля объединения имеют одинаковый тип и длину, от- личаясь только именами, то использование объединения подобно применению ссылки. Основное достоинство объединений — возможность разных трактовок одного и того же содержимого некоторого участка па- 64
объектов разных типов: union { float F; / / Безымянное объединение unsigned long К; } FK; FK.F = 3.141593; FK.К 1078530012 Битовые поля могут входить в состав объединений как union a1 { struct b2{ int a0:1; int a1:2; Download 1.98 Mb. Do'stlaringiz bilan baham: |
ma'muriyatiga murojaat qiling