||||
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结果为0,0乘以3300为0,最后结果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。
Archiver|手机版|科学网 ( 京ICP备07017567号-12 )
GMT+8, 2024-5-19 12:32
Powered by ScienceNet.cn
Copyright © 2007- 中国科学报社