Допустим, если просто объявить переменную типа int, присвоить ей огромное число, большее предела int, и вывести на экран. Int, естественно, переполнится, но выводится другое какое-то число, иногда с минусом. Откуда оно получилось?
при переполнении значения типа int, оно может обернуться или переполниться и начать с минимального значения типо int INTMIN или перейти к максимальному значению типа int INTMAX. Например если значение int имеет максимальное значение INTMAX и к нему прибавить 1 то результатом может быть переход к минимальному значению INTMIN. Аналогично если значение имеет минимальное значение INTMIN, и из него вычесть 1 то результатом может быть переход к максимальному значению INTMAX.
Существует зависимый от программно-аппаратной платформы псевдоним типа size_t, который представлен целым типом без знака, и который может хранить максимальный размер теоретически возможного объекта любого типа (включая массив и его аналоги, например тип символьной строки) на данной платформе. Если переменной данного типа присвоить -1, то за счёт переполнения значения можно получить максимальное значение для данного типа на целевой платформе. Это бывает полезным. Во всех остальных случаях арифметические операции с целыми числами чреваты неопределённым поведением, связанным с переполнением значения. В C++ предусмотрено исключение std:verflow_error, которое нужно использовать для сообщения об ошибках арифметического переполнения, потому как перемножение целых типов сродни размахиванию ломом в тёмное время суток. Это только вопрос времени, когда вы кого-нибудь огреете им по спине или по голове.
Особую опасность представляют арифметические операции между типами со знаком и типами без знака, с неявным приведением типов. Таких ситуаций нужно избегать, либо пользоваться любезно предоставленным костылём static_cast<>
Поэтому совершенно неважно по какому принципу получается значение переполнения типа до тех пор, пока не выпадет катастрофическое совпадение. Например, #include
using namespace std;
int main() {
constexpr auto startup_code = 260846532;
auto red_button = 12345678;
auto startup_key = 12345678;
auto command_code = red_button * startup_key;
if (command_code == startup_code) {
puts("Launch a nuclear attack!");
}
}