INT 带符号 求平均怎么算呀?怎么都弄不出来

[复制链接]
 楼主| wen_hau 发表于 2013-9-14 12:55 | 显示全部楼层 |阅读模式
           INT16 buf1,buf2,buf3,buf4;
           UINT32 sum;
        while(1)
        {
          buf1 =0x1f00;
          buf2=0x1f04;
          buf3=0x2200;
          buf4=0x2204;
          sum =buf1+buf2+buf3+buf4;
          sum >>= 2;
    }   
丢人
ayb_ice 发表于 2013-9-14 14:01 | 显示全部楼层
1:注意计算结果溢出
2:用/4,不要用>>=2
 楼主| wen_hau 发表于 2013-9-14 14:19 | 显示全部楼层
ayb_ice 发表于 2013-9-14 14:01
1:注意计算结果溢出
2:用/4,不要用>>=2

就是溢出的问题  /4 一样的  
diweo 发表于 2013-9-14 15:04 | 显示全部楼层
原理上肯定可以的。
 楼主| wen_hau 发表于 2013-9-14 15:19 | 显示全部楼层
diweo 发表于 2013-9-14 15:04
原理上肯定可以的。

别原理呀  说下怎么弄出来  
huang1007 发表于 2013-9-14 16:54 | 显示全部楼层
貌似楼主的程序有几个需要注意的地方
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;
    }  
 楼主| wen_hau 发表于 2013-9-14 18:09 | 显示全部楼层
           INT16 buf1,buf2,buf3,buf4;
           UINT32 sum=0;
        while(1)
        {
          buf1=0x1f00;
          buf2=0x1f04;
          buf3=0x2200;
          buf4=0x2204;
          sum +=buf1;
          sum +=buf2;
          sum +=buf3;
          sum +=buf4;
          sum >>= 2;
    }   这样好像可以了
diweo 发表于 2013-9-14 21:41 | 显示全部楼层
wen_hau 发表于 2013-9-14 15:19
别原理呀  说下怎么弄出来

可能是开发环境的原因吧,反正下午我试了一下可以的。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

7

主题

21

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部