Битовые поля
Особую разновидность структур представляют поля. Поле - это последовательность соседних бит внутри одного целого значения. Оно может иметь тип signed int либо unsigned int и занимать от 1 до 16 бит. Поля размещаются в машинном cлове в направлении от младших к старшим разрядам. Например, структура struct prim {int a:2; unsigned b:3; int:5; int с:1; unsigned d:5; } f,j; обеспечивает размещение, показанное на рис. 4.6. Если бы последнее поле было задано так: unsigned d:6;, то оно размещалось бы не в первом слове, а в разрядах 0-5 второго слова.
Рис. 4.6.Пример блока памяти, выделенного под битовое поле В полях типа signed крайний левый бит является знаковым. Например, такое поле шириной 1 бит может только хранить значения -1 и 0, так как любая ненулевая величина будет интерпретироваться как -1. Поля используются для упаковки значений нескольких переменных в одно машинное слово с целью экономии памяти. Они не могут быть массивами и не имеют адресов, поэтому к ним нельзя применять унарную операцию &. Пример: #include <stdio.h> struct {unsigned a: 1; unsigned b: 1; unsigned y: 1; unsigned c: 2; } f; void main () { int i; printf("размер f=%d байт \n",sizeof(f)); f.a =f.b=1;// в поля а и b записывается 1 for (i=0;i<2;i++) { f.y =f.a && f.b; // конъюнкция a и b printf(" цикл %d;f.y =%d\n", i, f.y); f.b=0; } f.c = f.a +!f.b;// сложение значений f.а и отрицание f.b (=1)8) printf("f.c=%d", f.c);} // f.c=2 результаты работы: размер f=1 байта цикл о;f.y =1 цикл 1;f.y =0 f.c=2 Смеси Смесь - это разновидность структуры, которая может хранить (в разное время) объекты различного типа и размера. В результате появляется возможность работы в одной и той же области памяти с данными различного вида. Для описания смеси используется ключевое слово union, а соответствующий синтаксис аналогичен синтаксису структуры. Пусть задано объявление: union r { int ir; float fr; char сr; } z; Здесь ir имеет размер 2 байта, fr - 4 байта и сr - 1 байт. Для z будет выделена память, достаточная чтобы сохранять самый большой из трех приведенных типов. Таким образом, размер z будет 4 байта. В один и тот же момент времени в z может иметь значение только одна из указанных переменных (ir, fr, сr). Пример: #include <stdio.h> union r{ int ir; float fr; char cr;} z;
|