Как я могу избежать арифметического исключения в этом коде C ++? - PullRequest
0 голосов
/ 20 сентября 2018

Я не знаю, почему моя программа показывает ошибка времени выполнения , например, когда мой ввод равен 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;

Что я сделал не так?

1 Ответ

0 голосов
/ 20 сентября 2018

при условии, что 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 вместо 2 147 483 647 currentPrinter получит -2 147 483 648.после 31-й итерации все становится еще хуже.

во время 31-й итерации ваш currentPrinter снова пытается умножить -2 147 483 648 на 2, и это приводит к тому, что currentPrinter становится равным 0, что опять-таки связано с переполнением int.

Ваша 31-я итерация все еще в порядке.но на 32-й итерации currentPrinter вызовет ошибку деления на ноль.следовательно, причина, по которой вы получаете ошибку деления на ноль.

enter image description here

...