Всегда ли это технически правильно:
unsigned abs(int n)
{
if (n >= 0) {
return n;
} else {
return -n;
}
}
Мне кажется, что здесь, если -INT_MIN> INT_MAX, "-n" выражение может переполняться, когда n == INT_MIN, поскольку -INT_MIN находится за пределами границ. Но в моем компиляторе это работает нормально ... это деталь реализации или поведение, на которое можно положиться?
Более длинная версия
Немного контекста: я пишу оболочку C ++ для целого числа GMP type (mpz_t) и вдохновившись существующей оболочкой GMP C ++ (называемой 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 принимают беззнаковые длинные аргументы. Существует ли риск переполнения выражения
-l
?