Почему моя функция, которая перечисляет все 10 степеней, которые могут быть представлены int, работает на одном компьютере, а не на другом? - PullRequest
0 голосов
/ 31 января 2020

Мой код выглядит следующим образом:

void findten ()
    {
        int x = 1, power = 0;
        printf("10^%d, x = %d\n", power++, x);
        while((x*10)/10 == x)
        {
            x *= 10;
            printf("10^%d, x = %d\n", power++, x);
        }
    }

Идея состоит в том, что l oop должен остановиться, когда x> 10e9 из-за максимального целочисленного значения. Когда я впервые запустил и скомпилировал это, оно работало просто отлично, и оно продолжает работать на компьютере, на котором я впервые написал. Давайте назовем этот компьютер A.

На другом компьютере, компьютере B, я скомпилировал тот же файл, содержащий функцию, и она не работает, вместо этого выполняя бесконечное l oop, где x в конечном итоге равно 0. Я запутался, почему это произошло.

Функция действительно одинакова в обоих случаях.

Правильный вывод, который компьютер A дает мне:

10^0, x = 1
10^1, x = 10
10^2, x = 100
10^3, x = 1000
10^4, x = 10000
10^5, x = 100000
10^6, x = 1000000
10^7, x = 10000000
10^8, x = 100000000
10^9, x = 1000000000

Компьютер B выводит тот же вывод, но затем продолжает работу и переполняет int. В конце концов, х = 0 в какой-то момент, по причине, которую я не понимаю.

1 Ответ

1 голос
/ 31 января 2020

Проблема в том, что целочисленное переполнение со знаком вызывает неопределенное поведение. Следовательно, x * 10 / 10 == x является проблемой, если x * 10 больше, чем INT_MAX.

Я предполагаю, что способ представления подписанных целых на одном из ваших компьютеров оборачивает int при переполнении, а на другом - нет.

...