在用C语言为8位AVR微控制器编程时,我遇到了意想不到的行为:
unsigned char a = 0xFF, b = 0xFF;
unsigned short c = ((a>>4)<<8)+b;
printf("%x",c);
其中,高阶字节a包含位8..11,字节b包含12位值c的位7..0,代码的初衷是删除不需要的低字节a,然后将a和b组合起来生成c的值。然而,后来我意识到代码不应该工作,因为a是一个8位值,将其向左移动8位将导致将字节清除为0,最后的结果是0x00FF。相反,代码产生0x0FFF的结果,正如最初所期望的那样。该代码在微控制器(a