数据类型导致计算溢出的问题

问题:数据类型使用不当和表达式使用不当是的计算溢出,导致数据错误。
看如下表达式:

int  XYZ_BaseVal[3], XYZ_SmoothVal[i];
XYZ_BaseVal[i] =  XYZ_BaseVal[i] * 95 +   XYZ_SmoothVal[i] * 5;
XYZ_BaseVal[i] =   XYZ_BaseVal[i] / 100;
数组元素的取值范围是-2408到2047.

所以, 当 XYZ_BaseVal[i] 的值比较大时,XYZ_BaseVal[i] * 95 表达式得到的是一个负数 ,导致计算结果错误。

做如下修改:

long Temp = 0;
Temp =    XYZ_BaseVal[i] * 95 +   XYZ_SmoothVal[i] * 5;

这样就可以了吗??结果是仍然错误。那么:

Temp =    XYZ_BaseVal[i] * 95;

结果仍然错误。

从这个表达式可以看到一个本质的问题,  XYZ_BaseVal[i] * 95 的计算结果放在哪里的? 从debug中可以看到 XYZ_BaseVal[i] * 95表达式的值为负数,然后再把这个数赋值给 Temp,所以修改后也不对。改为如下:

Temp1 = XYZ_BaseVal[i];
Temp1 *= 95;
Temp2 = XYZ_SmoothVal[i];
Temp2 *= 5;
Temp1 = Temp1 + Temp2;
Temp1 = Temp1 / 100;
XYZ_BaseVal[i] = Temp1;

这才正确。

2人评论了“数据类型导致计算溢出的问题”

发表评论

电子邮件地址不会被公开。 必填项已用*标注