打印
[C语言]

突然被一个很简单的问题困住

[复制链接]
1271|10
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
nightingale2003|  楼主 | 2018-3-14 16:01 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
习惯了无符号数取平均值。现在搞多个有符号数取平均值,突然不知怎么弄了。
比如4个16位无符号数取平均值,假设a[0]、a[1]、a[2]、a[3].这时不能     ((u32)a[0]+a[0]+a[0]+a[0])/4了
如果强制转换成32位相加,那0xFFFF之类相加会变成很大的数肯定不行
如果还是用16位相加,那0x7fff相加肯定出现不希望出现的溢出。
那写程序的时候该怎么写,求教
沙发
dirtwillfly| | 2018-3-14 16:58 | 只看该作者
(a[0]/4+a[1]/4+a[2]/4+a[3]/4)
如果预先知道总的数据个数,先除然后相加就好了

使用特权

评论回复
板凳
cainiao_123| | 2018-3-14 18:44 | 只看该作者
试试楼上的方法

使用特权

评论回复
地板
airwill| | 2018-3-14 20:53 | 只看该作者
楼上的办法有误差
有符号数 用 signed int

使用特权

评论回复
5
linqing171| | 2018-3-14 20:59 | 只看该作者
((s32)a[0]+a[1]+a[2]+a[3])/4
先定义一个有符号的大数,然后把他们都加进去来。最后除以个数就可以了。

使用特权

评论回复
6
xbyu520| | 2018-3-14 21:05 | 只看该作者
我觉得5楼的朋友的方法是可以的,虽然没有验证过。在ide里验证一下不就可以了。补码的知识复习一下

使用特权

评论回复
7
ayb_ice| | 2018-3-15 08:46 | 只看该作者
所有数据用有符号数不就可以了,有什么问题吗
#define s32 signed int

s32 v1,v2,v3,v4,v5;
v1= 10;
v2 = 20;
v3 = -10;
v4 = -20;

v5 = (v1+v2+v3+v4)/4;//v5 = 0

使用特权

评论回复
8
nightingale2003|  楼主 | 2018-3-15 08:53 | 只看该作者
感谢各位。初试了下用16位有符号数 int就OK。
主要是之前老是习惯定义成u8或者u16,正常定义就可以了。

使用特权

评论回复
9
gujiamao12345| | 2018-3-15 09:05 | 只看该作者
nightingale2003 发表于 2018-3-15 08:53
感谢各位。初试了下用16位有符号数 int就OK。
主要是之前老是习惯定义成u8或者u16,正常定义就可以了。 ...

哈哈,实践出真知...
不过几个比较大的数相加起来还是有问题吧

使用特权

评论回复
10
m564522634| | 2018-3-15 11:54 | 只看该作者
那个强制转有问题了

使用特权

评论回复
11
QuakeGod| | 2018-3-15 16:56 | 只看该作者
如果你原来的数据是有符号的,就不能U32,要用I32。

使用特权

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

本版积分规则

31

主题

105

帖子

2

粉丝