Насколько катастрофично целочисленное переполнение в C ++?

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

#include <iostream>

int main()
{
    int a = 46341;
    int b = a * a;
    std::cout << "hello world\n";
}

Поскольку a * a переполняется на 32-битных платформах, а целочисленное переполнение вызывает неопределенное поведение, есть ли у меня какие-либо гарантии, что hello world действительно будет появляются на моем экране?


Я удалил «подписанную» часть из своего вопроса на основе следующих стандартных цитат:

(§5 / 5 C ++ 03, §5 / 4 C ++ 11) Если во время оценка выражения, результат не определен математически или не входит в диапазон представимых значений для его типа, поведение не определено.

(§3.9.1 / 4) Целые числа без знака, объявленные unsigned , должны подчиняться законам арифметики по модулю 2 ^ n, где n - количество битов в представлении значения этого конкретного размера целого числа. . Это означает, что беззнаковая арифметика не переполняется , потому что результат, который не может быть представлен результирующим целочисленным типом без знака, уменьшается по модулю числа, которое на единицу больше наибольшего значения, которое может быть представлено результирующим беззнаковым целочисленным типом. .

22
задан jogojapan 2 March 2013 в 06:30
поделиться