如何避免此 C++ 代码中的算术异常?

How can I avoid Arithmetic exception in this C++ code?

我不知道为什么我的程序显示 runtime-error 例如,当我的输入是 100 时。 如果我输入一个较小的值,比如 5,它就可以正常工作!

#include<iostream>
using namespace std;

int main()
{
    int noCopy,currentPrinter = 1;
    cin >> noCopy;

    for(int i = 0; i <= noCopy / 2;i++){
        cout << noCopy / currentPrinter << endl;
        currentPrinter *= 2;
    }
}

我从 gdb 调试器中得到以下错误:

Program terminated with signal SIGFPE, Arithmetic exception.
cout << noCopy / currentPrinter << endl;

我做错了什么?

假设您系统上的 int 是 32 位长,那么您可以在 currentPrinter 中存储的最大数字是 2,147,483,647,最小数字是 -2,147,483,648。你得到算术错误的原因主要是因为被零除,但你最终被零除的原因是整数溢出。

如果你将 nocopy 设为 64,for 循环将 运行 正常直到 i 为 30。 此时 currentPrinter 将等于 1,073,741,824 乘以 2,将得到 2,147,483,648 的值,但是,由于这是一个 32 位 int,我们可以拥有的最大数字是 2,147,483,647。这就是问题开始的地方。由于 int 溢出,currentPrinter 的结果不是 2,147,483,647,而是 -2,147,483,648。在第 31 次迭代之后,情况变得更糟。

在第 31 次迭代期间,您的 currentPrinter 再次尝试将 -2,147,483,648 乘以 2,这导致 currentPrinter 变为 0,这也是由于 int 溢出。

你的第 31 次迭代仍然没问题。但在第 32 次迭代时,currentPrinter 将导致被零除错误。因此你得到除以零错误的原因。