一、 在单片机编译过程中出现表达式运算错误问题,怀疑是表达式运算过程中类型不匹配导致的错误。
问题代码:
u32 tmp = 0;
U16 _Humidity = 0;
S16 _Temperature = 0;
u8 recvbuf[6] = {0x01,0x84,0x87,0x81,0x80,0x2c};
tmp = (recvbuf[0]<<8)|recvbuf[1];
_Temperature = tmp*1750/65535 -450;
tmp = (recvbuf[3]<<8)|recvbuf[4];
_Humidity = tmp*1000/65535;
代码在MSP430中运行时,_Temperature 计算结果正常,_Humidity 计算结果异常(偶尔正常),正常结果为771,实际计算结果为65042
初步分析,怀疑是 (recvbuf[3]<<8)在编译器编译过程中有异常,因为recvbuf是u8型
优化后的代码:
tmp = recvbuf[0];
tmp = tmp*256+recvbuf[1];
tmp = tmp*1750/65535 -450;
_Temperature = tmp;
tmp = recvbuf[3];
tmp = tmp*256+recvbuf[4];
tmp = tmp*1000/65535;
_Humidity = tmp ;
经验证,代码优化后运行正常。
//==============================================================================
类似问题出现过多次,但是问题代码在VS中运行又是没有问题的,让人一头雾水。
由于编译器在编译优化的过程中,存在差异性,会导致不确定结果发生,所以建议在涉及到运算表达式时。
自定义一个变量作为中间变量,来存放运输结果,尤其在类型不匹配的情况下,比如,示例中,将 tmp = recvbuf[0];然后乘以256,避免移位过程中出现溢出。
//=============================================================================