почему результат всегда отрицательный? - PullRequest
0 голосов
/ 07 мая 2020

Любой вывод кода отрицательный, когда ввод положительный?

using namespace std;
int aa(int n) //
{
    int i=0;
    for(i=n;i>0;i--)
    {
        i=i*(i-1); //body

    }
    return i; //returning i
}

int main()
{

    cout<<aa(8); //function call

    return 0;
}

Почему я получаю отрицательное значение при выполнении вышеуказанной строки кода? После пересечения диапазона int он должен давать значение мусора, а значение мусора может быть любым. Оно не обязательно должно быть отрицательным.

1 Ответ

1 голос
/ 07 мая 2020

Когда n меньше или равно 2, возвращается значение 0. (Отрицательное значение не вводит l oop, 1 и 2 приводят к i = 0). Когда значение больше 2, значение i быстро растет из-за линии i = i*(i-1), пока не переполнится. Если результат переполнения - 1 (из-за i--) положительный, l oop продолжается с новым i. Поскольку условие тестирования является допустимым, быстрый рост неизбежно продолжается и приводит к все большему и большему количеству переполнений, что в конечном итоге приведет к тому, что при уменьшении 1 значение (i--) будет нулевым или отрицательным, и тогда условие теста не может быть пройдено, for l oop заканчивается и возвращается i.

Таким образом, положительные значения не могут быть возвращены , но i могло быть результатом положительного результата переполнения (когда переполнение приводит к 1 и уменьшается до 0 на i -).

Рассмотрение специального случая aa (8)
Прежде всего вызывается aa (8). * Создается 1015 * int i, которому присваивается значение 0.
Начинается for l oop. i становится 8,
8> 0, поэтому мы выполняем команды внутри тела и устанавливаем i равным 8 * 7 = 56 Мы достигли конца for, поэтому выполняем i--, i становится 55,

Снова мы проверяем условие теста и 55> 0, поэтому мы снова выполняем команды i = 55 * 54, блок for завершается, и мы выполняем i-- так что i = 2969,

Мы проверяем условие теста и 2969> 0, поэтому мы выполняем команды, i = 2969 * 2968, мы выполняем i-- итак i = 8881991.

8881991> 0, поэтому мы выполняем body i = 8881991 * 8881990, теперь происходит переполнение и i становится отрицательным числом, затем число уменьшается на i--

, но теперь условие проверки i> 0 ложно, и l oop заканчивается.

i возвращается.

Результат переполнения Результатом переполнения int может быть любое из чисел в его диапазоне.

Допустим, мы начинаем отсчет с нуля, чтобы представить указанное число.

Первое число, полученное в результате переполнения:

cout << INT_MAX+1;

вывод: -2147483648 (INT_MIN)

Отсюда мы можем считать дальше, поэтому результатом может быть любое из чисел между INT_MIN и INT_MAX, тест:

cout << INT_MAX+n

Когда n находится в диапазоне [1 (INT_MIN), 1 + INT_MAX + 1 (0 до этого момента) + INT_MAX (максимум)]

Снова мы достигаем INT_MAX и можем продолжать считать, как раньше ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...