Унарный минус и преобразование знакового в беззнаковый

Всегда ли это технически правильно:

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

?

11
задан bluescarni 8 April 2011 в 09:25
поделиться