【问题标题】:How to detect integer overflow? [duplicate]如何检测整数溢出? [复制]
【发布时间】:2021-10-03 12:43:52
【问题描述】:
  1. 编写一个程序,读取并存储一系列整数,然后计算前 N 个整数的总和。先求N,再读 将值转换为向量,然后计算前 N 的总和 价值观。例如:“请输入您想要的值的数量 sum:” 3 “请输入一些整数(按'|'停止):” 12 23 13 24 15 | “前 3 个数字的总和 (12 23 13) 是 48。”处理所有 输入。例如,如果用户确保给出错误消息 要求比向量中更多的数字的总和。
  2. 修改练习 8 中的程序,如果结果不能表示为 int,则写出错误。

所以在练习 9 中,如果结果不能表示为 int,它会写出一条错误消息,但是如果我在这里只是将整数相加,那么我在这里唯一能想到的会导致数字不如果有一些整数溢出并且整数高于 INT_MAX 或低于 INT_MIN ,则能够表示为 int ,但我该如何准确检测到呢?

这是我的代码:

#include<vector>
#include<cmath>
#include<string>
#include<iostream>
#include<algorithm>
#include<stdexcept>
using namespace std;

    int main()
    {
        int N = 0;
        vector<int> values;
        cout << "Please enter the number of values you want to sum." << '\n';
        cin >> N;
        cout << "Please enter some numbers" << '\n';
        for (int tempnum; cin >> tempnum; )
        {
    
            values.push_back(tempnum);
    
    
        }
        if (N > values.size())
        {
    
            cout << "How am I gonna add up more numbers than you gave me?" << '\n';
        }
        else
        {
            int total = 0;
            for (int i = 0; i < N; i++)
            {
                total += values[i];
            }
            
    
        }
    
    }

但我不能只检查总计是否高于或低于 INT_MAX 或 INT_MIN,因为 INT_MAX +1 或某些东西会返回一些随机负值,所以我不太确定该怎么做

【问题讨论】:

  • 请注意,问题是 integers 而不是 int。所以你不限于在计算中使用int。如果在您的系统上long 大于int,您可以使用它并根据最大可能的int 检查每次添加的结果。
  • 但是在练习 10 的练习 9 之后,它说: 10. 修改练习 8 中的程序,使用 double 而不是 int。此外,制作一个包含相邻值之间 N-1 个差异的双精度向量,并写出该差异向量。我假设这基本上意味着我必须在 8 和 9 中使用整数。

标签: c++


【解决方案1】:

你可以用一些算术来做到这一点:

所以你想知道acc + x &gt; INT_MAX,其中acc 是累加器(到目前为止的总和),x 是下一个元素。将它们加在一起可能会溢出。但是acc &gt; INT_MAX - x 是等价的,x 已经存储在int 中。所以这也不能underflow,bc。 x 最多可以是INT_MAX

即,只需转换不等式以避免溢出。在这种情况下,两边都减去 x。

这仅适用于正 x,感谢用户 interjay 指出这一点。

如果 x 为负数,则变为减法:

acc + (-x) > INT_MAX
acc - x    > INT_MAX

这不能溢出,因为我们正在从acc 中减去。但它可能下溢,所以问题就变成了:

acc - x < INT_MIN
acc     < INT_MIN + x

所以:

int acc = 0;
for (int i = 0; i < N; ++i) {
    int x = values[i];
    if (x >= 0 && acc > (INT_MAX - x)) {
        cout << "ERROR: Overflow.";
        return 1;
    } else if (x < 0 && acc < (INT_MIN - x)) {
        cout << "ERROR: Underflow.";
        return 1;
    } else {
        acc += x;
    }
}

【讨论】:

  • 如果x &lt; 0,这可能会溢出。您需要以不同的方式处理否定的x
  • 啊当,好点
  • Intmin 加上一个负数总是下溢。你的第二个 if 有错别字。
猜你喜欢
  • 1970-01-01
  • 2019-08-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-09
相关资源
最近更新 更多