Why is assigning a value to a bit field not giving the same value back?

  • A+
Category:Languages

I saw the below code in this Quora post:

#include <stdio.h>  struct mystruct { int enabled:1; }; int main() {   struct mystruct s;   s.enabled = 1;   if(s.enabled == 1)     printf("Is enabled/n"); // --> we think this to be printed   else     printf("Is disabled !!/n"); } 

In both C & C++, the output of the code is unexpectedly,

Is disabled !!

Though the "sign bit" related explanation is given in that post, I am unable to understand, how is it possible that we set something and then it doesn't reflect as it is.

Can someone give a more elaborate explanation?

 


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:n bitfield 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 int or a typedef-name defined as int, 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 int type for any form of bit manipulation.

Comment

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: