значимость отрицательных значений типа char в C - PullRequest
6 голосов
/ 21 декабря 2009
  1. символы в 'C' используются для обозначения символов.
  2. Числа, представляющие символы на всех кодовых страницах, всегда положительны.

Какая польза от подписанных символов ?? Используются ли отрицательные значения, содержащиеся в символах, только как интегральные значения в меньшем интегральном типе данных, чем int и short? У них нет другой интерпретации ?? (например, положительные значения в символах, представляющих символы)

Ответы [ 8 ]

11 голосов
/ 21 декабря 2009

символы в 'C' используются для обозначения символов.

Не всегда символы используются для представления байтов, это единственный тип в c с известным размером.

4 голосов
/ 21 декабря 2009

Только символы из базового набора символов исполнения гарантированно являются неотрицательными (C99, 6.5.2 §3):

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

Вы также должны различать тип * plain 'char и типы signed char и unsigned char: signed char и unsigned char - это обычные целочисленные типы, для которых выполняется следующее (C99, 6.5. 2 §5):

Объект, объявленный как тип со знаком char, занимает тот же объем памяти, что и ‘‘ Plain ’’ char объект.

4 голосов
/ 21 декабря 2009

Числа, представляющие символы на всех кодовых страницах, всегда положительны.

Эмм ... неправильно !?

Из стандарта C99, акцент мой:

Если элемент базового набора символов выполнения хранится в объекте char, его значение гарантированно будет положительным.

Не гарантируется, что все допустимые символы всех кодовых страниц являются положительными. Является ли char подписанным или неподписанным, определяется реализацией!

2 голосов
/ 21 декабря 2009

Остерегайтесь использования plain символов в качестве индексов массива.

char buf[10000];
fgets(buf, sizeof buf, stdin);
unsigned charcount[UCHAR_MAX] = {0};
char *p = buf;
while (*p) {
    charcount[*p]++; /* if (*p < 0) BOOM! */
    // charcount[(unsigned char)*p]++;
    p++;
}
2 голосов
/ 21 декабря 2009

С Домашняя страница Джека Кляйна :

Знаковый символ может содержать все значения в диапазоне от SCHAR_MIN до SCHAR_MAX, определенных в limit.h. SCHAR_MIN должен быть -127 или меньше (более отрицательный), а SCHAR_MAX должен быть 127 или больше. Обратите внимание, что многие компиляторы для процессоров, которые используют представление представления дополнения 2, поддерживают SCHAR_MIN, равный -128, но это не требуется стандартами.

Из того, что я могу сказать, нет официального "значения" signed char. Однако следует помнить, что все нормальные символы ASCII попадают в диапазон 0-127. Следовательно, вы можете использовать тип signed char, чтобы ограничить допустимые значения диапазоном 0-127 и определить в качестве ошибки значение, меньшее 0.

Например, если бы у меня была функция, которая просматривает некоторый текст ASCII и возвращает наиболее часто встречающийся символ, возможно, я мог бы определить отрицательное возвращаемое значение, чтобы означать, что для наиболее часто встречаются два или более символов. Это не обязательно хороший способ сделать что-то, это просто пример из головы.

1 голос
/ 21 декабря 2009

Стоит отметить, что тип char отличается от типа char со знаком и без знака.

0 голосов
/ 21 декабря 2009

В C char (включая signed char и unsigned char) используется для хранения байта , который стандарт C определяет как небольшое целое число размером не менее 8 бит.

Наличие байтов со знаком и без знака так же полезно, как и увеличение целых чисел. Если вы храните в массиве очень большое количество маленьких чисел (0..255 для неподписанных, -127..127 для подписанных [1]), вы можете использовать байты для них, а не, скажем, короткие целые числа , для экономии места.

Исторически, байт и текстовый символ были почти одним и тем же. Тогда кто-то понял, что языков больше, чем английский. В наши дни текст намного сложнее, но уже слишком поздно менять имя типа char в C.

[1] -128..127 для машин с двоичным представлением дополнения для отрицательных чисел, но стандарт C не гарантирует этого.

0 голосов
/ 21 декабря 2009

В C и C ++ символы могут быть подписаны или не подписаны. Переменная типа char может использоваться для хранения небольшого целочисленного значения. Это полезно по нескольким причинам:

  • На небольших машинах, например 8-битный микро. Это может позволить более эффективный доступ и манипулирование.
  • Если вы хотите иметь большой массив небольших значений, скажем, 100 КБ, вы можете сэкономить кучу памяти, используя вместо него массив символов. например Интс.

В C символьный литерал является целочисленной константой. «0» равно 48.

...