C Bit Fields

In C Programming Language we have option to store integer members into memory spaces smaller than the compiler would ordinarily allow. These can be achieved using the space-saving structure members are called bit fields, and their width in bits can be explicitly declared. This is very useful especially when memory or data storage is at a premium. A bit field is set up with a structure declaration that labels each field and determines its width.

Bit Field Declaration

A bit field declaration contains a type specifier followed by an optional member_name, a colon, a constant integer expression that indicates the field width in bits, and a semicolon.

Bit fields with a width of 0 must be unnamed. Unnamed bit fields cannot be referenced or initialized. If a series of bit fields does not make up to the size of an int, padding can take place.

The following example demonstrates padding. Suppose that an int occupies 4 bytes. The example declares the identifier room to be of type struct app_state:

The structure room contains eight members with a width of 16 bytes. The following table describes the storage that each member occupies:

Member Name Storage Occupied
light 1 bit
fan 1 bit
(padding — 30 bits) To the next int boundary
count The size of an int (4 bytes)
ac 4 bits
(unnamed field) 4 bits
clock 1 bit
(padding — 23 bits) To the next int boundary (unnamed field)
flag 1 bit
(padding — 31 bits) To the next int boundary

You can not access the field by direct its name.

Syntax:

We can access the member “light” as “room.light”,The following expression sets the light field to 1

When you assign to a bit field a value that is out of its range, the bit pattern is preserved and the appropriate bits are assigned. The following expression sets the “fan” field of the room structure to a 0 (zero) because only the least significant bit is assigned to the fan field:

Note :- The maximum bit field length is 64 bits. For portability, do not use bit fields greater than 32 bits in size.