Ano*_*non 11 c c++ standards cross-platform integer-overflow
我一直在考虑整数(类型int)溢出,并且我发现分裂可能溢出.
示例:在我当前的平台上,我有
INT_MIN == -INT_MAX - 1
Run Code Online (Sandbox Code Playgroud)
因此
INT_MIN < -INT_MAX
Run Code Online (Sandbox Code Playgroud)
因此
INT_MIN / -1 > -INT_MAX / -1
Run Code Online (Sandbox Code Playgroud)
因此
INT_MIN / -1 > INT_MAX.
Run Code Online (Sandbox Code Playgroud)
因此,除法(INT_MIN/-1)确实溢出.
所以,我有两个问题:
可以编写什么(跨平台)C代码以防止除法溢出(对于类型(带符号)int)?
什么保证(在C或C++标准中)可能有助于设计代码?
例如,如果标准保证我们有
INT_MIN == -INT_MAX - 1
Run Code Online (Sandbox Code Playgroud)
要么
INT_MIN == -INT_MAX,
Run Code Online (Sandbox Code Playgroud)
然后出现以下代码以防止溢出.
#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;
}
Run Code Online (Sandbox Code Playgroud)
chu*_*ica 10
什么保证(在C或C++标准中)可能有助于设计代码?
C将有符号整数表示指定为使用3种形式中的1种:符号和幅度,2的补码或1的补码.给定这些形式,只有0和2的补码除法INT_MIN/-1
可能溢出.
可以编写什么(跨平台)C代码以防止除法溢出(对于类型(带符号)int)?
int safe_int_div(int * res, int op1, 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;
}
Run Code Online (Sandbox Code Playgroud)