Знаки подписаны или не подписаны? - PullRequest
3 голосов
/ 07 августа 2011

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

Ответы [ 6 ]

3 голосов
/ 07 августа 2011

Если я правильно помню, «char» может быть подписанным или неподписанным (это зависит от компилятора / реализации). Если вам нужен неподписанный символ, вы должны явно запросить его (с «беззнаковым символом»), а если вам нужен подписанный символ, вы должны явно попросить его (с «подписанным символом»).

"char" - это просто (обычно 8-битное) целое число. Это не имеет ничего общего с персонажами.

Персонаж может быть чем угодно, в зависимости от того, что вы делаете. Я предпочитаю использовать "uint32_t" и Unicode (UTF-32). Для хрустящего старого / испорченного программного обеспечения, использующего ASCII, отлично подойдет char (независимо от того, подписано или нет значение char). Для UTF-8 вы, вероятно, захотите использовать «unsigned char» или «uint8_t».

Вы также можете попытаться использовать "wchar_t" (и заголовок "wchar.h"), но есть много способов, которые могут пойти не так (проведите некоторое исследование, если вас искушают).

2 голосов
/ 08 августа 2011

Причина, по которой компиляторам разрешено делать простые char подписанные, заключается в том, что еще в самые ранние времена языка программирования C каждый целочисленный тип был подписан. К тому времени, когда к языку были добавлены неподписанные типы, уже должно было существовать слишком много существующего кода, который выполнял такие вещи, как сохранение -1 в переменной char в качестве значения часового, чтобы было невозможно изменить компиляторы в существующих системах, например тот char был без знака. Вероятно, в любом случае не было большого давления на неподписанные символы; раннее развитие C произошло в 7-битном ASCII.

Поскольку C был перенесен на платформы, где присутствовали 8-битные печатаемые символы (например, мэйнфреймы IBM, говорящие на EBCDIC или ПК), компиляторы там сделали char без знака, потому что наличие печатаемого символа с отрицательным значением было бы еще больше Кошмар переносимости, чем невозможность сохранить -1 в char. С другой стороны, это привело к текущей ситуации, когда переносимый код не может делать никаких предположений о подписи char.

2 голосов
/ 07 августа 2011

char - это целое число, обычно шириной 8 бит. Но поскольку его подпись определяется реализацией (то есть зависит от компилятора), вероятно, не стоит использовать ее для арифметики. Вместо этого используйте unsigned char или signed char или, если вы хотите применить ширину, используйте uint8_t и int8_t из stdint.h.

0 голосов
/ 07 августа 2011

В коде ниже:

signed char c = -1;
printf("%c %d\n", c, c);
c = c >> 1;
printf("%c %d\n", c, c);

Результат будет другим, если вы используете unsigned char вместо signed char (по крайней мере, на моем «Процессоре AMD Athlon (64)» с gcc под cygwin). Причина этого в том, что когда вы сдвигаете вправо значение без знака, оно дополняется нулем, а когда вы делаете то же самое со отрицательным значением со знаком, оно дополняется единицей.

Хотя это полезно, я не могу сказать ... но это ситуация, когда знак символа имеет значение.

0 голосов
/ 07 августа 2011

В любом месте, где вы хотите представить значение в диапазоне [-128, 127], подходит символ со знаком. Если у вас есть структура со многими полями, которые будут создаваться много раз, важно сохранить как можно меньшие типы данных.

0 голосов
/ 07 августа 2011

В соответствии с тем, что вы упомянули, char - это 8-битные целочисленные значения.Вам не нужно, чтобы они были отрицательными для большинства практических целей.Поскольку они должны быть представлены в виде битов и позволять выполнять над ними арифметические операции, они представляются как int.Конечно, у вас также есть unsigned char.

...