Bit-fields are incredibly poorly defined by the standard. Given this code struct mystruct {int enabled:1;};, then we don’t know:
- How much space this occupies – if there are padding bits/bytes and where they are located in memory.
- Where the bit is located in memory. Not defined and also depends on endianess.
- Whether an
int:nbitfield is to be regarded as signed or unsigned.
Regarding the last part, C17 6.7.2.1/10 says:
A bit-field is interpreted as having a signed or unsigned integer type consisting of the
specified number of bits 125)
Non-normative note explaining the above:
125) As specified in 6.7.2 above, if the actual type specifier used is
intor a typedef-name defined asint,
then it is implementation-defined whether the bit-field is signed or unsigned.
In case the bitfield is to be regarded as signed int and you make a bit of size 1, then there is no room for data, only for the sign bit. This is the reason why your program might give weird results on some compilers.
Good practice:
- Never use bit-fields for any purpose.
- Avoid using signed
inttype for any form of bit manipulation.