gpt4 book ai didi

c++ - 整数除法溢出

转载 作者:可可西里 更新时间:2023-11-01 16:07:05 25 4
gpt4 key购买 nike

问题

我一直在考虑整数(int 类型)溢出,我想到除法可能会溢出。

示例:在我当前的平台上,我有

INT_MIN == -INT_MAX - 1

因此

INT_MIN < -INT_MAX

因此

INT_MIN / -1 > -INT_MAX / -1

因此

INT_MIN / -1 > INT_MAX.

因此,除法 ( INT_MIN/-1 ) 会溢出。


问题

所以,我有两个问题:

  1. 可以编写什么(跨平台)C 代码来防止除法溢出(对于类型(有符号)int)?

  2. 哪些保证(在 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 种形式中的一种:符号和大小、二进制补码或个数补码。给定这些形式,只有 INT_MIN/-1 的除以 0 和二进制补码除法可能会溢出。

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 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;
}

关于c++ - 整数除法溢出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30394086/

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