c – 整数除法溢出

c – 整数除法溢出,第1张

概述问题 我一直在考虑整数(类型int)溢出,并且我发现除法可能溢出. 示例:在我当前的平台上,我有 INT_MIN == -INT_MAX - 1 因此 INT_MIN < -INT_MAX 因此 INT_MIN / -1 > -INT_MAX / -1 因此 INT_MIN / -1 > INT_MAX. 因此,除法(INT_MIN / -1)确实溢出. 问题 所以,我有两个问题: >可以编写什么 问题

我一直在考虑整数(类型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;}
总结

以上是内存溢出为你收集整理的c – 整数除法溢出全部内容,希望文章能够帮你解决c – 整数除法溢出所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1241731.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-06
下一篇 2022-06-06

发表评论

登录后才能评论

评论列表(0条)

保存