Почему мой результат отрицательный? Я умножаю 2 положительных числа? - PullRequest
2 голосов
/ 06 апреля 2019

Ожидаемый результат следующей программы - это первое совершенное квадратное число, последние две цифры которого нечетны (ЧТО НЕ СУЩЕСТВУЕТ). Таким образом, вместо возврата пустого экрана (так как такого числа не существует), вывод будет -2147479015, который является ОТРИЦАТЕЛЬНЫМ.

Но код cout << i*i, что, безусловно, неотрицательно. Я посмотрел это онлайн и увидел кое-что о «переполнении», но я не совсем понимаю, что такое переполнение. Когда я гуглю его, все, что я получаю, это атаки переполнения, а это не то, что я хочу знать.

int main() {
    for(int i =1; ; i++) {
        if(i*i%2 !=0 && i*i/10%2 !=0) {
            cout << i*i;
            return 0;
        }
    }
}

Что такое переполнение? Почему я получаю отрицательное число?

Ответы [ 2 ]

4 голосов
/ 06 апреля 2019

Числовые переменные (например, ваше «i», которое является «int») могут содержать только ограниченный диапазон чисел.В целях демонстрации, скажем, есть только четыре различных числа, которые может содержать int (очевидно, что реальное int может содержать намного больше).Эти числа могут быть -2, -1, 0 и 1.

Если у меня есть int, значение которого равно 0, и я добавляю к нему 1, я получаю int, значение которого равно 1. Но если язатем добавьте еще 1, я не получаю int со значением 2. Помните, что int не может иметь значение 2. Он может иметь только значения -2, -1, 0 или 1.

Таким образом, вместо 1 + 1 будет «обтекание»: при переходе «мимо» максимально возможного значения оно возвращается к минимально возможному значению.Так что 1 + 1 = -2.

Это «переполнение».То, что происходит с вами, это то же самое, но с умножением, а не сложением, и, конечно, «int» имеет много, гораздо больше возможных значений, чем просто четыре.

0 голосов
/ 08 апреля 2019

В этом случае переполнение означает, что емкость типа данных была достигнута и превышена. В случае типа данных int старший значащий бит зарезервирован для указания отрицательного значения:

(dec)2147483647 = (hex)0x7FFFFFFF.

Если вы добавите 1 к номеру 2147483647, будет активирован отрицательный флаг (0x80000000).

С (https://en.cppreference.com/w/cpp/language/types) Я оставляю вам изображение с ограничениями для каждого типа данных:

enter image description here

Используйте unsigned long long int вместо int, чтобы иметь широкий диапазон положительных и целочисленных значений.

...