Combining two uint8_t as uint16_t
This is quite simple. You need no casts, you need no temporary variables, you need no black magic.
uint8_t d1=0x01;
uint8_t d2=0x02;
uint16_t wd = (d2 << 8) | d1;
This is always well-defined behavior since d2 is always a positive value and never overflows, as long as d2 <= INT8_MAX
.
(INT8_MAX is found in stdint.h).
You can use bitwise operators:
uint16_t wd = ((uint16_t)d2 << 8) | d1;
Because:
(0x0002 << 8) | 0x01 = 0x0200 | 0x0001 = 0x0201
The simplest way is:
256U*d2+d1