永发信息网

关于C51的一个问题

答案:1  悬赏:70  手机版
解决时间 2021-11-17 22:18
  • 提问者网友:你独家记忆
  • 2021-11-17 09:53
关于C51的一个问题
最佳答案
  • 五星知识达人网友:英雄的欲望
  • 2021-11-17 10:21
是这样的,首先,你的mm,和adc_data定义的类型都是整数型的数据,整数型的数据,在进行乘除计算的时候,每次的运算,取的是整数部分,不进行四舍五入。
mm = adc_data/255*10,先运算 adc_data/255,正常的结果是 0x64/255 = 0.39216,取整数,结果就是0,再进行0*10的计算,结果就是 0,后面的计算也是如此。

所以就会出现下面的结果。

mm=adc_data/255*10 ; //运算后mm=0
mm=adc_data/255*100 ; //运算后mm=0
mm=adc_data/255*1000 ; //运算后mm=0

你把上面的乘除计算顺序反过来,先计算乘法,再计算除法,并且进行强制类型转换:
mm=((unsigned int)adc_data)*10/255 ; //运算后mm = 3
因为你的adc_data 是unsigned char 类型的,adc_data *10 可能会大于255,所以,为了安全起见,你要先进行类型转换。

mm=adc_data*1.0/255 ; //运算后mm=0
mm=adc_data*1.0/255*10 ; //运算后mm=0x0003
mm=adc_data*1.0/255*100 ; //运算后mm=0x0027
mm=adc_data*1.0/255*1000 ; //运算后mm=0x0188

至于这部分,因为你是*1.0,有小数存在,所以,adc_data被隐性转换为float类型的,后面的结果也会以小数类型进行计算,计算完成后的最终的结果,再进行取整数,把整数部分赋值给mm

mm=adc_data*1.0/255 ; //运算后mm = 0.39216,取mm=0
mm=adc_data*1.0/255*10 ; //运算后mm = 3.9216,取mm=0x0003
mm=adc_data*1.0/255*100 ; //运算后mm = 39.216,取mm=0x0027
mm=adc_data*1.0/255*1000 ; //运算后mm = 392.16,取mm=0x0188

你这种计算结果,与
mm=((unsigned int)adc_data)*10/255 ;
mm=((unsigned int)adc_data)*100/255 ;
mm=((unsigned int)adc_data)*1000/255 ;
的结果是一样的,但是,在运算速度上,后者是远远快于前者的,所以,通常,我们用后面的算法,而不是前面的小数的形式。
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯