貌似楼主的程序有几个需要注意的地方
1,数值溢出问题,16位的4个有符号数加起来溢出了,转换成32位先
sum =(int32_t)buf1+buf2+buf3+buf4;
2,有符号数的右移问题,无符号数属于逻辑右移,右移1位相当于除2.但是有符号数标准一般是算术右移(依据编译器可能有不同),即右移后最高位补符号位,平常情况下也可以用右移代替除法.但是-1右移的时候还是-1.安全起见可以写成(Sum>0)?(Sum>>2):( -(ABS(Sum)>>2) )
3,有符号数不建议写成0x1f00的形式,毕竟最高位是符号位,这种形式不容易区分正数还是负数.
4,其实4个数都是正数,为什么不直接用uint16_t形式,而要采用有符号数.有符号数与无符号数运算的时候,有符号数会被强制转换为无符号数参加运算
,很容易造成错误.
UINT16 buf1,buf2,buf3,buf4;
UINT32 sum;
while(1)
{
buf1 =0x1f00;
buf2=0x1f04;
buf3=0x2200;
buf4=0x2204;
sum =(UINT32)buf1+buf2+buf3+buf4;
sum >>= 2;
}
|