Does this code port well to a 16 bit machine (written on 32 bit machine)?
int code = 0x10 ; int marker = 0x20 ; unsigned long frame; int main(void) { frame = (unsigned short)~marker<<11 | (unsigned short)code<<5 | marker; frame|= (unsigned long)~code<<16 ;
frame = (unsigned short)(~marker<<11); // 0000F800 rather than 07FEF800
See what I did there? Awesome, it's call precedence, and I changed it, so now the answer generated matched the expectation, rather than the order the compiler does it in the original case, which as you say is well defined, but not what the OP wanted.