C语言算术运算易错点

一、 在单片机编译过程中出现表达式运算错误问题,怀疑是表达式运算过程中类型不匹配导致的错误。

    问题代码:

    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,避免移位过程中出现溢出。

//=============================================================================

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值