Это всегда технически корректно:
unsigned abs(int n)
{
if (n >= 0) {
return n;
} else {
return -n;
}
}
Мне кажется, что здесь, если -INT_MIN > INT_MAX, выражение "-n" может переполняться при n == INT_MIN, поскольку -INT_MIN находится за пределами границ. Но на моем компиляторе это, похоже, работает нормально... это детали реализации или поведение, на которое можно положиться?
Более длинная версия
Немного контекста: я пишу С++-оболочку для целочисленного типа GMP (mpz_t) и беру вдохновение для существующей оболочки GMP С++ (называемой mpz_class). При обработке добавления mpz_t со знаками целых чисел существует такой код:
static void eval(mpz_ptr z, signed long int l, mpz_srcptr w)
{
if (l >= 0)
mpz_add_ui(z, w, l);
else
mpz_sub_ui(z, w, -l);
}
Другими словами, если целое число со знаком положительное, добавьте его с помощью подпрограммы беззнакового сложения, если целое число со знаком отрицательно добавить его, используя процедуру беззнакового вычитания. Обе подпрограммы * _ui принимают unsigned long как последние аргументы. Является ли выражение
-l
под угрозой переполнения?