Особую разновидность структур представляют поля. Поле - это последовательность соседних бит внутри одного целого значения. Оно может иметь тип 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 второго слова.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
d
| d
| d
| d
| d
| b
| не используется
| b
| b
| b
| a
| a
|
| | | | | | | | | | | | | | | | | | |
Рис. 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