Вот лучшая и более пуленепробиваемая реализация, чем та, которая была принята в качестве ответа, которая также быстра:
#include <climits>
#include <cassert>
unsigned int add_digit(unsigned int val, unsigned int digit)
{
// These should be computed at compile time and never even be given a memory location
static const unsigned int max_no_overflow = (UINT_MAX - 9) / 10U;
static const unsigned int max_maybe_overflow = UINT_MAX / 10U;
static const unsigned int last_digit = UINT_MAX % 10;
assert(digit >= 0 && digit < 10);
if ((val > max_no_overflow) && ((val > max_maybe_overflow) || (digit > last_digit))) {
// handle overflow
} else {
return val * 10 + digit;
}
assert(false);
}
Вы также должны иметь возможность сделать это встроенной функцией. Проверка переполнения почти всегда будет коротким замыканием после первого сравнения. Предложение после &&
просто так, что вы можете (в случае 32-битного целого числа с дополнением до двух) добавить 5 к концу 429496729, но не 6.