Hello to everyone, i have this example:
union { struct { unsigned char x:4; unsigned char y:4; } nibble; unsigned char abyte; } value;
I'am not sure how to acces to the byte and the two nibble's. I tried several hours, maybe there's a mistake in my textbook? Or there is a fatal error in my understanding of struct and union's!
There's an really idioticall way to solve this: Just toggling thru all permutations of syntax :-( No, better to ask someone who knows and is willing to help :-)
Not sure what your question is exactly but this might help.
union { struct { unsigned char x:4; unsigned char y:4; } nibble; unsigned char abyte; } value; typedef union { struct { unsigned char x:4; unsigned char y:4; } nibble; unsigned char abyte; } tyvalue; int main(void) { tyvalue myvalue; value.abyte = 0x12; value.nibble.x = 0xF; value.nibble.y = 0xF; myvalue.abyte = 0x12; myvalue.nibble.x = 0xF; myvalue.nibble.y = 0xF
Bit fields in C differ between implementations. If your code happens to work with one compiler, it may fail with another. However, shifts and masking always work. I think, all you need is a few macros:
#define CHAR2LO(c) ((c)&0xF) #define CHAR2HI(c) (((c)>>4)&0xF) #define NIBBLES2CHAR(lo,hi) ((((hi)&0xF)<<4)|((lo)&0xF)) #define INSERTLO(c, lo) (((c)&0xF0)|((lo)&0xF)) #define INSERTHI(c, hi) (((c)&0xF)|(((hi)&0xF)<<4))
By the way, that's what the compiler actually does to implement bit fields.
Regards, - mike
"I'am not sure how to acces to the byte and the two nibble's."
value.nibble.x value.nibble.y value.abyte
BTW: In English, never use apostrophes for plurals.
"Bit fields in C differ between implementations"
Also, the ordering of bytes within multi-byte values, and the possibility of extra padding bytes within structures, etc...
"By the way, that's what the compiler actually does to implement bit fields."
In addition to that, if you specify a boolean op and a shift op, the ARM compiler will most likely generate a single machine instruction to perform the bitfield set/clear.
There is one advantage of using bitfields instead of low-level bit-shift-and-mask though: clarity of code and intention of the programmer.
As long as you don't assume any physical mapping of the struct to the underlying storage, you can safely rely on the integer promotions of the bitfield to int, i.e., if you have a bitfield of 3 bits, you can safely use its value as a word-extended value to int in a expression.
may be the syntax is wrong. I use a comma at the end of a part.
int partA: 4 , partB: 2 , partC: 1 ;
It works fine.