mahdert
4/5/2011 7:07:00 PM
On Apr 4, 10:21 pm, Eric Sosman <esos...@ieee-dot-org.invalid> wrote:
> On 4/4/2011 9:46 PM, mt wrote:
>
> > Can I use bit fields to create my own variable of 32 bits, 20 of which
> > I will use for something, and use the rest as 3 1 byte values, and can
> > i them make an array of it?
>
> Your bit-counting seems off, but you can make a struct of
> four bit-fields, like
>
> struct thing {
> int something : 20;
> int small1 : 4;
> int small2 : 4;
> int small3 : 4;
> };
>
> ... and you can make an array of such structs
>
> struct thing array[42];
>
> ... allowing `array[3].something = 9;' and `array[17].small2 = 3;'
> and so on. You cannot make arrays of the individual fields, as in
>
> struct badthing {
> int something : 20;
> int small[3] : 4; /* BZZZZT! */
> };
>
> There are a few portability gotchas. First, C only defines bit-
> fields that are based on `int', `signed int', `unsigned int', and
> (in the C99 Standard) `_Bool', and a bit-field can only have as many
> bits as its base type has. (A given compiler may allow other base
> types, but is not obliged to.) Since the various flavors of `int'
> can be as narrow as 16 bits, the `:20' width may be too wide for some
> compilers and might not work. You'll get a compile-time diagnostic
> if it doesn't, though.
>
> Second, a compiler is free to treat a plain `int' bit field as
> either signed or unsigned, at its discretion. A free-standing `int'
> variable is always signed, but this needn't hold for bit-fields.
> This means that `array[12].small1 = -1;' may store a minus one on
> some implementations, but a plus fifteen on others. The bad news is
> that you might not get any compile-time diagnostic, and be stuck with
> mysterious malfunctions at run-time. The good news is that if you
> explicitly write `signed int small1 : 4' or `unsigned int small2 : 4'
> you can override the compiler's preference. Recommendation: Always
> use `signed int' or `unsigned int' as the base type for a bit-field,
> never plain `int'.
>
> --
> Eric Sosman
> esos...@ieee-dot-org.invalid
yes, my bit count was off because I meant to day 3 4 bit values.
Thanks for the invaluable advice. I will print it and post it on my
work board.