c – 整数除法溢出

前端之家收集整理的这篇文章主要介绍了c – 整数除法溢出前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
问题

我一直在考虑整数(类型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;
}
原文链接:https://www.f2er.com/c/119421.html

猜你在找的C&C++相关文章