打印

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

[复制链接]
1563|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
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 | 只看该作者
原理上肯定可以的。

使用特权

评论回复
5
wen_hau|  楼主 | 2013-9-14 15:19 | 只看该作者
diweo 发表于 2013-9-14 15:04
原理上肯定可以的。

别原理呀  说下怎么弄出来  

使用特权

评论回复
6
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;
    }  

使用特权

评论回复
7
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;
    }   这样好像可以了

使用特权

评论回复
8
diweo| | 2013-9-14 21:41 | 只看该作者
wen_hau 发表于 2013-9-14 15:19
别原理呀  说下怎么弄出来

可能是开发环境的原因吧,反正下午我试了一下可以的。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

7

主题

21

帖子

1

粉丝