Мне просто интересно, как на самом деле происходит катастрофическое переполнение целого числа. Возьмите следующую примерную программу:
#include <iostream>
int main()
{
int a = 46341;
int b = a * a;
std::cout << "hello world\n";
}
Так как a * a
переполняется на 32-битных платформах и триггеры переполнения целых чисел undefined, есть ли у меня какие-либо гарантии, что hello world
действительно появится на моем экране?
Я удалил "подписанную" часть из моего вопроса на основе следующих стандартных котировок:
(§5/5 С++ 03, §5/4 С++ 11) Если во время оценки выражения результат не определяется математически или нет в диапазоне представляемых значений для его типа, поведение undefined.
(§3.9.1/4) Беззнаковые целые числа, объявленные
unsigned
, должны подчиняться законам арифметики по модулю 2 ^ n, где n - количество бит в представлении значений этого конкретного размера целого числа. Это означает, что беззнаковая арифметика не переполняет, потому что результат, который не может быть представлен результирующим беззнаковым целым типом, уменьшается по модулю число, которое больше одного наибольшего значения, которое может быть представлено полученным целым без знака тип.