3

A typical use of bitfield is to declare a space efficient variable smaller than 8 bits. What i don't understand is the value of declaring those bits as short, int , long , bool etc. For example

typedef struct{
    int first:3,
    short second:3,
    char third:3
    } somestruct;

In above case, all 3 variables, i.e. first, second and third are 3 bit long. What is the value of declaring the variable first as int, second as short and third as char?

Or, why is even a data type required? I should be able to declare the above as

typedef struct{
    first:3,
    second:3,
    third:3
    } modifiedstruct;

The modifiedstruct assumes no datatype for the variables first, second and third. The responsibility of interpreting the 3 bits as character, numeric or floating should be responsibility of something else.

Both gcc and g++ on linux allow the above behavior.

Jimm
  • 8,165
  • 16
  • 69
  • 118

4 Answers4

5

Actually, the C standard only allows bitfields to be of type signed int or unsigned int (and _Bool in C99). If you can throw a short, long or char in there, that's a compiler extension.

As to why, the main reason is signedness. Consider:

struct {
   int s: 3;
   unsigned u: 3;
} bf;

bf.s = 7;
bf.u = 7;

Both of these bitfields are all ones. However, C preserves sign, so:

(int)bf.s == -1    // Because signed conversions preserve the sign bit
bf.s >> 1 == -1    // So do right shifts on signed values

while:

(int)bf.u == 7     // Because the source is unsigned and so just a series of bits
bf.u >> 1 == 3     // Unsigned right shifts are just moving bits around as well

For compilers that allow char, it's probably the same sort of thinking. The default signedness of char is implementation-defined so if you want a bitfield's signedness to match your compiler's char's signedness, you can define it as char.

Chris Reuter
  • 1,458
  • 10
  • 8
  • My whole question is why introduce different datatypes in bitfields such as char(Bool) and int and second, what is difference between int x:2 and char y:2 ? – Jimm Feb 10 '12 at 18:37
2

The size is for the storage (or transportation) of the data. The data type is how you intend to use and process that information.

Ed Heal
  • 59,252
  • 17
  • 87
  • 127
0

Using any other type than int for a bit-field is implementation-defined behavior. So without knowing what specific compiler you are using, there is no telling what that code does, or if it even compiles.

Bit-fields in general are very poorly defined by the standard, and therefore completely unportable. Since bit-fields are also pretty much a superfluous feature of the C language, it is most likely wiser to do bit manipulations using the bit-wise operators.

Lundin
  • 195,001
  • 40
  • 254
  • 396
0

The only time that types inside a bitfield matter to me is signed vs. unsigned types. For fields wider than 1 , this can make a difference in how the data is interpreted during assignment.

AShelly
  • 34,686
  • 15
  • 91
  • 152