问题
我一直在考虑整数(类型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; }
解决方法
What guarantees (in C or C++ standard) might help to devise the code?
C将有符号整数表示指定为使用3种形式中的1种:符号和幅度,2的补码或1的补码.给定这些形式,只有0和2的INT_MIN / -1的补码除法可能溢出.
What (cross-platform) C code could one write in order to prevent division overflows (for type (signed) int)?
int safe_int_div(int * res,int op2) { if (op2 == 0) { return 1; } // 2's complement detection #if (INT_MIN != -INT_MAX) if (op1 == INT_MIN && op2 == -1) { return 1; } #endif *res = op1 / op2; return 0; }