Переполнение означает, что результат добавления будет превышать std::numeric_limits<int>::max()
(еще в C дней мы использовали INT_MAX
).Выполнение такого сложения приводит к неопределенному поведению.Машина может аварийно завершить работу и при этом соответствовать стандарту C ++.Хотя вы, скорее всего, получите INT_MIN
в результате, на самом деле нет никакого преимущества в зависимости от какого-либо результата вообще.
Решение состоит в том, чтобы вместо сложения выполнить вычитание, чтобы предотвратить переполнение и возьмите специальный случай:
if ( number > std::numeric_limits< int >::max() - 1 ) { // ie number + 1 > max
// fix things so "normal" math happens, in this case saturation.
} else {
++ number;
}
Не зная желаемого результата, я не могу быть более конкретным об этом.Влияние на производительность должно быть минимальным, так как редко используемая ветвь может быть удалена параллельно с последующими инструкциями, не задерживая их.
Редактировать: Чтобы просто выполнять математику, не беспокоясь о переполнении или обработкеСамостоятельно, используйте библиотеку bignum, такую как GMP .Это довольно портативный и, как правило, лучший на любой платформе.Имеет интерфейсы C и C ++. не напишите свою собственную сборку.Результат будет непереносимым, неоптимальным, а интерфейс будет вашей ответственностью!