Reputation: 34553
struct stats
{
char top : 1;
char bottom : 1;
char side : 2;
} MyStat;
I have seen this format with integers but how does the above char bit field work and what does it represent?
Thank You.
Upvotes: 5
Views: 6941
Reputation: 137830
Bitfields should be declared with type signed int
, unsigned int
, or bool
from <stdbool.h>
. Other types may or may not be legal (depending on the platform), but be careful about the signedness — plain int
may be taken to be unsigned for a bitfield.
That said, it may be a hint to the compiler that the alignment of the struct
should be 1 and not sizeof(int)
. And the compiler is allowed to accept char
and assign it such meaning.
According to C99 6.7.2.1/9,
A bit-field is interpreted as a signed or unsigned integer type consisting of the specified number of bits. If the value 0 or 1 is stored into a nonzero-width bit-field of type _Bool, the value of the bit-field shall compare equal to the value stored.
and a footnote:
As specified in 6.7.2 above, if the actual type specifier used is
int
or a typedef-name defined asint
, then it is implementation-defined whether the bit-field is signed or unsigned.
Upvotes: 5
Reputation: 14376
it just defines the size of the variable that you will use.
char
int
This is not supported by the standard (typical use is unsigned int), but it's a nice attempt :)
re: your query, it's an attempt by the implementer to use less memory for their bitfields (char as opposed to unsigned int)
Additionally, from Atmel, we get:
in the C Standard, only “unsigned (int)” and “int” are acceptable datatypes for a bitfield member. Some compilers allow “unsigned char” ........
Upvotes: 2
Reputation:
Char bit fields work in the same way as int, just the base type is 8-bit wide, not 32-bit. So you'd get a struct stats, which has the size of 1 byte, and 3 member variables, occupying a total of 4 bits.
Upvotes: 7