c语言short的溢出,C平均值及数值溢出问题

两个数的平均值是非常简单的,也就是 (a+b)/2. 但具体到C语言环境里,却有玄机。

Int型大数的平均值问题

对两个Int32类型大数,例如2147483644和2147483646,求平均值。首先在C里用尝试以下算法:

int a = INT32_MAX - 3; //2147483644

int b = INT32_MAX - 1; //2147483646

int val = (a + b) / 2;

printf("average1: %d + %d = %d\n", a, b, val);

//实际打印结果:

//2147483646 + 2147483644 = -3

显然结果非我们期望的,这是因为 a+b之和超出了Int32的范围。而对于-3的由来,我们可以如下推算:

假定INT32_MIN = -2147483648, INT32_MAX = 2147483647, 那么:

INT32_MIN + INT32_MAX == -1

INT32_MIN == INT32_MAX + 1

所以 a + b = INT32_MAX - 3 + INT32_MAX - 1

= INT32_MIN - 1 - 3 + INT32_MAX - 1

= INT32_MIN + INT32_MAX - 5

= -1 - 5 = -6

(a+b)/2 = -6/2 =-3

如何求得正确的平均值呢?

Int型大数求平均值的正确姿势

直接上代码:

int a = INT32_MAX - 3; //2147483644

int b = INT32_MAX - 1; //2147483646

if ((a >0 && b>0) || (a<0 && b<0)){

val = a + (b-a)/2;

} else {

val = (a+b)/2;

}

printf("average2: %d + %d = %d\n", a, b, val);

//2147483646 + 2147483644 = 2147483645

主旨思想就是确保计算过程当中,不要有超出int32范围的中间数。

Short型大数的平均值

Short型运算时,会把Short型自动转为Int32型,所以基本上不用考虑溢出的问题了。

short x = INT16_MAX - 3; //32764

short y = INT16_MAX - 1; //32766

short val = (x + y) /2;

printf("(%d + %d)/2 = %d\n", x, y, val);

// (32766 + 32764)/2 = 32765

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值