There is an SRC variable of 16 bits, how to create two 8-bit variables, so that one is addressed to the upper part and the second to the lower part of the SRC variable? type construction
uint16_t src; uint8_t b1 = * ((uint8_t *) & src); uint8_t b2 = * (((uint8_t *) & src) +1);
should work but at compilation produces:
MAIN.c (16): error: # 28: expression must have a constant value uint8_t b1 = * ((uint8_t *) & src); MAIN.c (17): error: # 28: expression must have a constant value uint8_t b2 = * (((uint8_t *) & src) +1); MAIN.c: 0 warnings, 2 erros
How to correctly address the variables B1 and B2 that, when changing these variables, the corresponding value in the SRC variable and vice versa change. Sorry for my english :)
For all who are interested in - a single address space variable and access to bits and bytes. Full version:
union Register32 { struct { unsigned a0: 1; unsigned a1: 1; unsigned a2: 1; unsigned a3: 1; unsigned a4: 1; unsigned a5: 1; unsigned a6: 1; unsigned a7: 1; unsigned a8: 1; unsigned a9: 1; unsigned a10: 1; unsigned a11: 1; unsigned a12: 1; unsigned a13: 1; unsigned a14: 1; unsigned a15: 1; unsigned a16: 1; unsigned a17: 1; unsigned a18: 1; unsigned a19: 1; unsigned a20: 1; unsigned a21: 1; unsigned a22: 1; unsigned a23: 1; unsigned a24: 1; unsigned a25: 1; unsigned a26: 1; unsigned a27: 1; unsigned a28: 1; unsigned a29: 1; unsigned a30: 1; unsigned a31: 1; } bit; struct { uint8_t byte1; uint8_t byte2; uint8_t byte3; uint8_t byte4; } bytes; struct { uint16_t low; uint16_t high; } words; uint32_t dword; }; union Register16 { struct { unsigned a0: 1; unsigned a1: 1; unsigned a2: 1; unsigned a3: 1; unsigned a4: 1; unsigned a5: 1; unsigned a6: 1; unsigned a7: 1; unsigned a8: 1; unsigned a9: 1; unsigned a10: 1; unsigned a11: 1; unsigned a12: 1; unsigned a13: 1; unsigned a14: 1; unsigned a15: 1; } bit; struct { uint8_t low; uint8_t high; } bytes; uint16_t dint; }; union Register8 { struct { unsigned a0: 1; unsigned a1: 1; unsigned a2: 1; unsigned a3: 1; unsigned a4: 1; unsigned a5: 1; unsigned a6: 1; unsigned a7: 1; } bit; uint8_t bytes; }; typedef union Register32 EAX32; typedef union Register16 EAX16; typedef union Register8 EAX8;