Вопрос Что за числа выводятся при переполнении int в c++?

Регистрация
1 Июл 2013
Сообщения
91
Репутация
0
Спасибо
0
Монет
0
Допустим, если просто объявить переменную типа int, присвоить ей огромное число, большее предела int, и вывести на экран. Int, естественно, переполнится, но выводится другое какое-то число, иногда с минусом. Откуда оно получилось?
 
при переполнении значения типа int, оно может обернуться или переполниться и начать с минимального значения типо int INTMIN или перейти к максимальному значению типа int INTMAX. Например если значение int имеет максимальное значение INTMAX и к нему прибавить 1 то результатом может быть переход к минимальному значению INTMIN. Аналогично если значение имеет минимальное значение INTMIN, и из него вычесть 1 то результатом может быть переход к максимальному значению INTMAX.
 
для простой int 65k предел. Надо больше - объявляй больше, int32
На чем код исполняется?
 
С каких пор разрабы C++ стали интересоваться чем-то кроме дилдо?
 
Существует зависимый от программно-аппаратной платформы псевдоним типа size_t, который представлен целым типом без знака, и который может хранить максимальный размер теоретически возможного объекта любого типа (включая массив и его аналоги, например тип символьной строки) на данной платформе. Если переменной данного типа присвоить -1, то за счёт переполнения значения можно получить максимальное значение для данного типа на целевой платформе. Это бывает полезным. Во всех остальных случаях арифметические операции с целыми числами чреваты неопределённым поведением, связанным с переполнением значения. В C++ предусмотрено исключение std::eek: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!");
}
}
 
Если это unsigned int, то , например, 4294967296 это 0 , 4294967297 это 1, -1 это 4294967295, -2 это 4294967294
Если это signed int ,то это UB
 
Назад
Сверху