Почему SCHAR_MIN определяется как -127 в C99? - PullRequest
6 голосов
/ 04 ноября 2011

§5.2.4.2.1 C99 определяет SCHAR_MIN как -127 и SCHAR_MAX как 127. Не должен ли диапазон для 8-битового целого числа со знаком быть от -128 до +127?

limits.h для моего компилятора определяет SCHAR_MIN как (-1 << ((CHAR_BIT)-1)), что равно -128, если CHAR_BIT равно 8.

Есть ли причина, по которой SCHAR_MIN было определено -127, а не -128?

1 Ответ

25 голосов
/ 04 ноября 2011

На самом деле SCHAR_MIN не определяется как -127, он определяет минимальный диапазон символов со знаком до -127..127.

Он делает это, потому что должен уметь обрабатывать другие две схемы кодирования для чисел со знаком, которые являются дополнением и знаком / величиной. Оба из них имеют положительный и отрицательный ноль, скрывая -128, который вы найдете в дополнении к двум.

ISO C (C99), раздел 6.2.6.2/2, утверждает, что реализация должна выбрать одно из этих трех различных представлений для подписанных целочисленных типов данных:

  • два дополнения;
  • Свое дополнение; или
  • знак / величина

Реализация дополнения двух значительно перевешивает другие, но другие do существуют.

Во всех этих представлениях положительные числа идентичны, единственной разницей являются отрицательные числа.

Чтобы получить отрицательное представление для положительного числа, вы:

  • инвертировать все биты, затем добавить один для дополнения до двух.
  • инвертировать все биты для дополнения.
  • инвертирует только бит знака для знака / величины.

Вы можете увидеть это в таблице ниже, для 5 и 0:

number | two's complement    | ones' complement    | sign/magnitude
=======|=====================|=====================|====================
     5 | 0000 0000 0000 0101 | 0000 0000 0000 0101 | 0000 0000 0000 0101
    -5 | 1111 1111 1111 1011 | 1111 1111 1111 1010 | 1000 0000 0000 0101
       |                     |                     |
     0 | 0000 0000 0000 0000 | 0000 0000 0000 0000 | 0000 0000 0000 0000
    -0 | 0000 0000 0000 0000 | 1111 1111 1111 1111 | 1000 0000 0000 0000
           (no difference)        (both of these have distinct +/-0)
...