【发布时间】:2015-05-22 10:16:16
【问题描述】:
问题
我一直在考虑整数(int 类型)溢出,我突然想到除法可能会溢出。
示例:在我当前的平台上,我有
INT_MIN == -INT_MAX - 1
因此
INT_MIN < -INT_MAX
因此
INT_MIN / -1 > -INT_MAX / -1
因此
INT_MIN / -1 > INT_MAX.
因此,除法 (INT_MIN / -1) 确实会溢出。
问题
所以,我有两个问题:
可以编写什么(跨平台)C 代码来防止除法溢出(对于(有符号)int 类型)?
哪些保证(在 C 或 C++ 标准中)可能有助于设计代码?
例如,如果标准保证我们有任何一个
INT_MIN == -INT_MAX - 1
或
INT_MIN == -INT_MAX,
然后出现下面的代码防止溢出。
#include <limits.h>
/*
Try to divide integer op1 by op2.
Return
0 (success) or
1 (possibly overflow prevented).
In case of success, write the quotient to res.
*/
int safe_int_div(int * res, int op1, int op2) {
/* assert(res != NULL); */
/* assert(op2 != 0); */
if ( op1 == INT_MIN && op2 == -1 ) {
return 1;
}
*res = op1 / op2;
return 0;
}
【问题讨论】:
-
OT:按照惯例,您希望在出错时返回
-1。 -
@Anon。如果您还添加诸如
if (!op2) return 2之类的内容,则可以解决另一个除法问题:) -
这与计算机如何在硬件上进行除法有关
标签: c++ c cross-platform standards integer-overflow