【发布时间】:2014-09-15 05:29:33
【问题描述】:
我最近了解到整数溢出是 C 中未定义的行为(附带问题 - 它也是 C++ 中的 UB 吗?)
在 C 编程中,您通常需要找到 a 和 b 两个值的平均值。然而,(a+b)/2 可能会导致溢出和未定义的行为。
所以我的问题是 - 在 C 中找到两个值 a 和 b 的平均值的正确方法是什么?
【问题讨论】:
-
展开表达式。是的,有符号整数溢出在 C 和 C++ 中都是 UB(虽然我不了解 C,但根据 C++ 标准,无符号算术不会溢出)。
-
a/2 + b/2例如不会导致整数溢出。 -
如果符号相反,
(a + b)/2不会溢出。如果标志相同,则a + (b - a) / 2是安全的。 -
@DeepBlackDwarf: 但是 (1 + 3)/2 = 2 而 1/2 + 3/2 = 1。
-
@bodacydo:除非您想要 1 和 3 的平均值为 1 这样的结果,否则应避免使用
a/2 + b/2。你可能会做一些花哨的事情,比如a/2 + b/2 + (a%2 + b%2)/2,我认为你得到了正确的答案,但是......
标签: c undefined-behavior integer-overflow