当前位置: 首页 > 知识库问答 >
问题:

这个用于检测整数加法溢出的函数实际上有效吗?

汪弘毅
2023-03-14

在阅读关于这个问题的评论时,我发现了一个指向comp.lang.c常见问题解答的链接,该链接显示了一个“小心加法函数”,据称该函数检测整数溢出:

int
chkadd(int a, int b)
{
    if (INT_MAX - b < a) {
        fputs("int overflow\n", stderr);
        return INT_MAX;
    }
    return a + b;
}

如果b==-1,这如何不溢出?如果假设ab都是正数,为什么首先将它们设为int而不是无符号int

共有2个答案

阮轶
2023-03-14

可能他们只是忽略了它。FAQ页面上的其他链接似乎提供了更正确的代码。

唐修诚
2023-03-14

OP已经发现INT_MAX-b可能溢出,使得剩余的代码对于正确的溢出检测无效。它不起作用。

if (INT_MAX - b < a) {  // Invalid overflow detection

一种在没有UB的情况下检测溢出的方法如下:

int is_undefined_add1(int a, int b) {
  return (a < 0) ? (b < INT_MIN - a) : (b > INT_MAX - a);
}

为什么首先要让它们成为< code>int而不是< code>unsigned int?

更改为<code>无符号无符号[0…UINT_MAX]的范围可能是int:[int_MIN…int_MAX]。IOWs:INT_MAX==UINT_MAX。这种系统现在很少见。在IAC中,使用<code>is_undefined_add1()编码时不需要更改类型。。

 类似资料:
  • 问题内容: 我知道有人多次问过这个话题,但是 我的问题是关于完整32位int的溢出 。例如: 我发现话题与这个类似的问题,但该算法是不完美的。 有没有简单,快速,安全的方法来检查此内容? 问题答案: 从Java 8开始,该类中提供了一组方法: …以及很长的版本。 如果发生溢出,这些方法中的每一个都会引发。否则,如果它在该范围内,它们将返回正确的结果。 添加示例: 看到此代码在IdeOne.com上

  • 问题内容: 我在C ++编写一个程序来找到所有的解决方案一b = c ^,其中一个,b和c ^一起使用所有的数字0-9只出现一次。该程序循环了a和b的值,并且每次在a,b和a b上运行一个数字计数例程,以检查是否满足数字条件。 但是,当a b超出整数限制时,可能会生成伪解。我最终使用如下代码检查了这一点: 有没有更好的测试溢出方式?我知道有些芯片具有发生溢出时设置的内部标志,但我从未见过通过C或C

  • 我一直在考虑整数(int类型)溢出,我突然想到除法可能溢出。 示例:在我当前的平台上 因此 因此 因此 因此,除法 (INT_MIN / -1 ) 确实溢出。 因此,我有两个问题: > 可以编写哪些(跨平台)C代码来防止除法溢出(对于类型(有符号)int)? 什么保证(在C或C标准中)可能有助于设计代码? 例如,如果标准保证我们有 或者 然后出现以下代码来防止溢出。

  • 虚拟机安装:Ubuntu 12.04(x86) 什么是整数溢出? 存储大于最大支持值的值称为整数溢出。整数溢出本身不会导致任意代码执行,但整数溢出可能会导致堆栈溢出或堆溢出,这可能导致任意代码执行。在这篇文章中,我将仅谈论整数溢出导致堆栈溢出,整数溢出导致堆溢出将在后面的单独的帖子中讨论。 数据类型大小及范围: 当我们试图存储一个大于最大支持值的值时,我们的值会被包装 。例如,当我们尝试将存储到带

  • 问题内容: 在回答了这个问题之后,我很困惑为什么这段代码中的整数溢出而不是负数。奇怪,为什么这么精确的数字?为什么是0? 输出: 问题答案: 仅当的起始值为偶数时,才会发生这种情况。 根据JLS§15.17.1: 如果整数乘法溢出,则结果是数学乘积 的低阶位 ,以某种足够大的二进制补码格式表示。结果,如果发生溢出,则结果的符号可能与两个操作数值的数学积的符号不同。 如果我们以二进制格式而不是十进制

  • 本文向大家介绍C#整数溢出,包括了C#整数溢出的使用技巧和注意事项,需要的朋友参考一下 示例 整数可以存储的最大容量。而当您超过该限制时,它将循环回到负面。对于int,它是2147483647 对于超出此范围的所有整数,请使用System.Numerics数据类型为BigInteger的名称空间。检查下面的链接以获取更多信息https://msdn.microsoft.com/zh-cn/libr