8051(8位)微控制器上出现意外的位移结果
请考虑以下代码:
#include <hal_types.h> int main() { uint16 crc16; // hal_types.h: typedef unsigned short uint16; crc16 = 0x43; // debugger: crc16 == 0x0043,as expected crc16 = crc16 << 8; // crc16 == 0x0000 ???? return 0; } 此代码在TI CC1111 SoC(带有8051内核)上运行,并使用IAR EW8051 8.10.3进行编译/调试,配置为使用C99方言,无需优化.使用IAR调试器观察注释中的值(使用模拟器或实际设备的结果相同). 我希望在crc16 = crc16<<之后8;,crc16的值为0x4300,而不是0x0000. 根据C99标准(以及2005年5月5日至2005年5月的草案),第6.5.7.3-4节.
我对此的看法是结果类型应该是无符号的16位整数,其值为((0x0043)*(2 ^ 8))%0x10000 == 0x4300. 我错过了什么吗?谢谢. 解决方法
我弄清楚发生了什么.即使没有优化,我没有使用crc16的事实似乎改变了语义.如果我在最后添加以下行,
if (crc16) crc16 = 0x1234; 然后crc16在crc16 = crc16<<之后具有期望值(0x4300). 8 ;. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |