香山书院分享 http://blog.sciencenet.cn/u/wjwqbit we're back, we're back in San Francisco

博文

2.数据运算出错

已有 3062 次阅读 2010-7-29 22:56 |个人分类:嵌入式C语言编程常见错误(连载)|系统分类:科研笔记|关键词:学者| 嵌入式C语言

 

   

    C语言的运算符遵从先乘除后加减、从左至右,先括号内后括号外。在嵌入式软件编程中经常用到数据运算,如ADC采样值运算。下面列出了几种常用运算错误,编译环境是Keil V3

 #define  COEFF  (262/100)  //2.62

 int ADC_Value = 512 ;         //ADC转换值 范围:(0~1023

  int Temp_Value = 0 ;         //温度值

   ADC_Value = (long)ADC_Value/1024*3300; //ADC转换实际电压:mV

  Temp_Value =((long)ADC_Value+1500)*COEFF; 

  Temp_Value =((long)ADC_Value+1500/1024)*COEFF; 

   

² 运算行错误:先除后乘,先算整除512/1024结果为00乘以33000,最后结果ADC_Value也为0,与预想的512/1024*3300=1650相差甚大。修改为ADC_Value = (long)ADC_Value*3300/1024后结果正确。

² 运算行错误:常量COEFF(262/100),运算先算括号内部(262/100)结果整除为2,最终结果Temp_Value值为3000。将COEFF宏定义直接改为2.62后,结果正常,因为遇到浮点型数据时,是先自动转换成浮点型数据再计算的。只不过转成浮点运算时,计算时间会增加一点。

² 运算行错误:仍然是运算顺序问题,计算时先计算除法1500/2000=0,在计算加法,此时ADC_Value虽然转化为浮点型,但最终结果仍为0



https://m.sciencenet.cn/blog-331690-348361.html

上一篇:1.数组边界溢出问题(2010.07.20)
下一篇:3. If else编程习惯

0

发表评论 评论 (0 个评论)

数据加载中...

Archiver|手机版|科学网 ( 京ICP备07017567号-12 )

GMT+8, 2024-5-19 12:32

Powered by ScienceNet.cn

Copyright © 2007- 中国科学报社

返回顶部