Hello! I have a typedef union and variable:
typedef union int2char{unsigned char high_byte; unsigned char low_byte; unsigned int int_byte; } int2char; int2char dac_value;
When i assign
dac_value.int_byte = 0xAAAA;
i have
dac_value.int_byte = 0xAAAA; dac_value.low_byte = 0xAA; dac_value.high_byte = 0xAA;
but when i assign,example,0xFF05
dac_value .int_byte = 0xFF05; dac_value.low_byte =0xFF; dac_value.high_byte = 0xFF;
same results are obtained when i assign,example,0x1005
dac_value .int_byte = 0x1005; dac_value.low_byte =0x10; dac_value.high_byte = 0x10;
I can not understand where the error and why?? thanks for the help!.
since all elements of a union are placed at the same location in memory, low_byte and high_byte have the same address and therefore the same value nope, not in C
Erik
nope, not in C
Have a look at 6.7.2.1 in ISO/IEC 9899:1999.
Bullet 14 says: "The size of a union is sufficient to contain the largest of its members. The value of at most one of the members can be stored in a union object at anytime. A pointer to a union object, suitably converted, points to each of its members (or if a member is a bit-field, then to the unit in which it resides), and vice versa."
Note that a pointer to a union object points to each of its members - that is because all members of a union starts at the start of the union. That also means that the union must match the alignment of the member that has highest alignment requirements.
{ unsigned char high_byte; unsigned char low_byte; unsigned int int_byte; } int2char; I always do this instead and thus "got caught" unsigned short i; unsigned char c[2];