gpt4 book ai didi

c - 找到两个值的平均值的正确方法是什么?

转载 作者:太空狗 更新时间:2023-10-29 16:30:28 25 4
gpt4 key购买 nike

我最近了解到整数溢出是 C 语言中的未定义行为(附带问题 - 它在 C++ 中也是 UB 吗?)

在 C 编程中,您经常需要求出两个值 ab 的平均值。但是执行 (a+b)/2 会导致溢出和未定义的行为。

所以我的问题是 - 在 C 中找到两个值 ab 的平均值的正确方法是什么?

最佳答案

Secure Coding 的帮助下

if (((si_b > 0) && (si_a > (INT_MAX - si_b))) ||
((si_b < 0) && (si_a < (INT_MIN - si_b))))
{
/* will overflow, so use difference method */
return si_b + (si_a - si_b) / 2;
}
else
{
/* the addition will not overflow */
return (si_a + si_b) / 2;
}

附录

感谢@chux 指出舍入问题。这是经过正确舍入测试的版本...

int avgnoov (int si_a, int si_b)
{
if ((si_b > 0) && (si_a > (INT_MAX - si_b)))
{
/* will overflow, so use difference method */
/* both si_a and si_b > 0;
we want difference also > 0
so rounding works correctly */
if (si_a >= si_b)
return si_b + (si_a - si_b) / 2;
else
return si_a + (si_b - si_a) / 2;
}
else if ((si_b < 0) && (si_a < (INT_MIN - si_b)))
{
/* will overflow, so use difference method */
/* both si_a and si_b < 0;
we want difference also < 0
so rounding works correctly */
if (si_a <= si_b)
return si_b + (si_a - si_b) / 2;
else
return si_a + (si_b - si_a) / 2;
}
else
{
/* the addition will not overflow */
return (si_a + si_b) / 2;
}
}

关于c - 找到两个值的平均值的正确方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24920503/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com