Каким образом работает выражение S[0] = S[0] * 8; Переполнение[решен]

Рейтинг: -3Ответов: 1Опубликовано: 12.07.2023

Смысл такой, что в массив int S[3] передается значение, как я понимаю, стэка, т.е. каждый из элементов заполнен условным числом -858993460 (число взято из программы, но оно каждый раз разное, неизменным остается то, что оно отрицательное). При умножении на 8 оно становится положительным, аналогично условно, 1717986912. Почему так происходит?

Ответы

▲ 5Принят

(-858993460 * 8) mod 232 ≡ 1717986912.

Ваше сочетание компилятора и процессора считает целые значения по модулю 232.

В стандартном C++ такие вычисления вне закона. Программист обязан следить за тем чтобы промежуточные и окончательные значения в арифметических операциях не приводили к выходу за пределы диапазона int (в вашем случае [-231, 231 - 1]). Иначе случается неопределённое поведение. Грубо говоря, нет никаких гарантий относительно поведения программы, если случилось переполнение.

В конкретных реализациях C++ вы можете полагаться особенности компилятора. В данном случае программа вычисляет по модулю. Читайте документацию по конкретному компилятору, проверяйте сгенерированный машинный код (ассемблер).

P.S. Чтение неинициализированной переменной - тоже неопределённое поведение. Иногда вы прочтёте мусор, иногда ноль, иногда программа упадёт или начнёт вести себя непредсказуемо. Проверяйте машинный код или следуйте стандарту.

P.P.S. Следуйте стандарту.