Я обнаружил это, пока Обнаружение переполнения беззнакового целого числа довольно тривиально, обнаружение переполнения знакового в C/C++ на самом деле сложнее, чем думает большинство людей.
Самый простой очевидный, но наивный способ сделать это будет примерно таким:
Код: Выделить всё
int add(int lhs, int rhs)
{
int sum = lhs + rhs;
if ((lhs >= 0 && sum < rhs) || (lhs < 0 && sum > rhs)) {
/* an overflow has occurred */
abort();
}
return sum;
}
Несмотря на то, что приведенная выше проверка скорее всего, будет работать на многих компиляторах, на это нельзя рассчитывать. Фактически, поскольку стандарт C гласит, что переполнение знакового целого числа не определено, некоторые компиляторы (например, GCC) оптимизируют вышеуказанную проверку, когда установлены флаги оптимизации, поскольку компилятор предполагает, что переполнение знакового числа невозможно. Это полностью сводит на нет попытку проверить наличие переполнения.
Итак, другой возможный способ проверить наличие переполнения:
Код: Выделить всё
int add(int lhs, int rhs)
{
if (lhs >= 0 && rhs >= 0) {
if (INT_MAX - lhs
Подробнее здесь: [url]https://stackoverflow.com/questions/3944505/detecting-signed-overflow-in-c-c[/url]