例如,当我输入100时,我不知道为什么我的程序为什么显示 runtime-error 。 如果我输入一个较小的值(例如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;
我做错了什么?
答案 0 :(得分:2)
假设系统上的int长度为32位,因此您可以在currentPrinter中存储的最大数量为2,147,483,647,最小值为-2,147,483,648。出现算术错误的原因主要是由于被零除而导致的结果却被零除的原因是由于整数溢出。
如果您将nocopy设置为64,则for循环将一直运行到我30岁为止。 此时,currentPrinter等于1,073,741,824乘以2,将得出2,147,483,648的值,但是,由于这是32位int,因此我们可以拥有的最大数量为2,147,483,647。这是问题开始的地方。由于int溢出,currentPrinter会以-2,147,483,648结尾,而不是2,147,483,647。在第31次迭代之后,情况变得更糟。
在第31次迭代中,您的currentPrinter再次尝试将-2,147,483,648乘以2,这导致currentPrinter变为0,这又是由于int溢出造成的。
您的第31次迭代仍然很好。但是在第32次迭代中,currentPrinter将导致被零除的错误。因此,您得到除以零误差的原因。