Учебное пособие Самара 2015 + 004. 43 Ббк 32. 973 Н 19


Download 1.98 Mb.
bet20/53
Sana15.08.2023
Hajmi1.98 Mb.
#1667321
TuriУчебное пособие
1   ...   16   17   18   19   20   21   22   23   ...   53
Bog'liq
Lekcii AiSD 2015

Битовые поля

Структуры могут содержать битовые поля последователь- ности двоичных разрядов внутри одного целого значения. Язык С++ позволяет использовать любой целый тип . Будет он знако- вым или беззнаковым, зависит от реализации компилятора, так же как и порядок размещения битовых полей в машинном слове. Именно поэтому битовые поля имеют имена, для обеспечения не- зависимости от машинной реализации. Приведём пример струк- турного типа, содержащего битовые поля.


struct kilo int a:2;
unsigned b:3;
int :5 // не используется int c:1:
unsigned d:5:
Состав этих полей показан на рисунке 5.1.



15

14

13

12

11

10

9

8

7

6

5

4

3

2

1

0

d

с

fІспользует-
сЯ

b

а

Рис. 5.1 — Состав битовых полей


62
Для битового поля можно явно определить тип siqned или uns iqned. В битовом поле типа siqned крайний левый бит яв- ляется знаковым. Такое поле шириной в 1 бит может хранить значения только 0 или —1.
Битовое поле без имени просто резервирует указанное число разрядов. Битовое поле без имени с нулевым размером указывает, что следующее битовое поле начинается на границе машинного
CMOBd.
Доступ к битовому полю производится также как к компо- ненту структуры.
kilo ssc; ssc.a 1;

Битовые поля используются для упаковки значений не- скольких переменных в одно машинное слово с целью экономии памяти, отводимой под данные, но это увеличивает размер ис- полняемого кода для доступа к этим данным и снижает произво- дительность программы.


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



      1. Объединения

Объединение — это некоторая переменная, которая может хранить в разное время объекты различных типа и размера. Такая переменная имеет размер, достаточный для размещения наи- большего из своих полей. Объединения объявляются при помощи служебного слова 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:
1   ...   16   17   18   19   20   21   22   23   ...   53




Ma'lumotlar bazasi mualliflik huquqi bilan himoyalangan ©fayllar.org 2024
ma'muriyatiga murojaat qiling