有一个函数,debug编译产物运行结果正确,release编译产产物运行结果有错误,请问优化导致了那些问题?
static __inline f8 __cal_BaseCarrPh1(chx_para* pCH,u4 RegH,u4 RegL)
{
double result;
unsigned int quotient;
IFCycleMod = 500000;
IF_ratio = 500000/25000000;
result = RegH*IFCycleMod + RegL*IF_ratio;
quotient =result/65536;
result = result – quotient*65536;
return result;
}
这个函数就是求RegH*IFCycleMod + RegL*IF_ratio对65536求余,并加上小数部分,其返回值应该小于65536,release版本固件返回值有的远大于65536。
zhengbao ou:
打印了信息,发现问题应该出在quotient*65536运算上面
zhengbao ou:
回复 zhengbao ou:
将result = result – quotient*65536改为result = result – (double)quotient*65536;结果就没有问题,或者用while(rest>=0){result = result – 65536;quotient++}代替quotient =result/65536也没有问题,请教原因?
Tony Tang:
回复 zhengbao ou:
看看编译产生的汇编代码,对比分析一下。
Ryan BL:
类型前面建议都明确,特别是不匹配的类型。我发现好多优化后的类型不匹配的情况,最常见的就是u32赋值给u64后,u64成“负数”,明确的在u32前面加上个u64的强转就好了。