Приятно то, что в дополнении к двум вам не нужно знать, есть ли у вас номера со знаком или без знака. Просто возьмите двоичное представление, добавьте и отбросьте бит переполнения. Если вы оставили диапазон представимых чисел, ну, вам не повезло. Но добавление двух отрицательных чисел и получение положительного должно вызвать подозрение.
На практическом замечании: не пытайтесь защититься от переполнения в C, задавая такие вещи, как
a = b+c;
if (((b > 0) && (a < c)) || ((b < 0) && (a > c))) {
...
}
Это, вероятно, будет работать в стандартных сборках отладки, но компиляторы C (и C ++) могут оптимизировать эту проверку. (Это чаще всего наблюдается для арифметики без знака, if (a >= (a+b)) { ... }
и gcc -Wall
предупреждают, что он знает, что это ложно. Это нормально, поскольку стандарт C говорит, что переполнение в любом случае неопределенное поведение.)
Я не знаю, как обстоят дела в других языках с целочисленными типами с ограниченным диапазоном.