c语言 - CodeWarrior 编译器警告:"Possible loss of data"



请考虑以下代码:

unsigned int  beta;
unsigned int theta;
unsigned int m = 4;
unsigned int c = 986;
unsigned int Rpre = 49900;

unsigned int getUAnalog(unsigned char channel) // to get the PT1000 Signal
{
unsigned int result;
unsigned int f_temp;
//select channel and initiate conversion
ADCSC1 |= (channel & 0b11111);

//wait until conversion is complete
while(!ADCSC1_COCO);

f_temp = ADCRH;
f_temp <<= 8;
f_temp += ADCRL;

beta = (((f_temp) / (4096*28))*1000); // warning: possible loss of data.
theta = ((((beta)*(Rpre))/(1-beta))*1000);
result = (theta-c)/(m);
return result;
}

我使用MC9S08DZ60 (http://www.freescale.com/files/microcontrollers/doc/data_sheet/MC9S08DZ60.pdf)与pt1000温度传感器在CodeWarrior版本5.9.0。该函数用于计算temp并返回"result"。但是"beta"one_answers"theta"的值仍然是0。没有变化。

我也得到警告作为C2705:可能丢失的数据。result的值不正确。请帮忙,因为我不知道出了什么问题!!

提前感谢!

您的4096*28不适合16位无符号整数,并且将被截断,给您错误的结果,这就是为什么您得到警告。

但最重要的是…

beta = (((f_temp) / (4096*28))*1000); // warning: possible loss of data.
theta = ((((beta)*(Rpre))/(1-beta))*1000);
result = (theta-c)/(m);

等价于

beta = (((f_temp) / (4096*28))*1000);
theta = ((((beta)*(49900))/(1-beta))*1000);
result = (theta-986)/(4);

对应于:

result = ((((((((f_temp) / (4096*28))*1000))*(49900))/(1-(((f_temp) / (4096*28))*1000)))*1000)-986)/(4)

如果你把它画出来,你会发现在f_temp =14336/125≈115处有一个不连续,result的范围从f_temp =0时的-986/4(≈-247)到f_temp =115时的≈-4*109f_temp =14336/125时的-∞。

这表明要么你做错了(你有错误的公式或常数),要么你没有给我们足够的信息(f_temp的有效范围(s)将是很好的)。由于result的范围,使用整数算法进行这些计算是有问题的。

相关内容

  • 没有找到相关文章

最新更新