почему знак char не определен в C? - PullRequest
20 голосов
/ 27 мая 2009

Стандарт C гласит:

ИСО / МЭК 9899: 1999, 6.2.5.15 (стр. 49)

Три типа char, подписанный char и беззнаковый символ все вместе называется типы символов. реализация должна определить символ для имеют одинаковый диапазон, представление, и поведение как подписанный символ или символ без знака.

И действительно, gcc определяет это в соответствии с целевой платформой.

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

Более того, в ANSI C (до C99) единственным типом байтового размера является char, поэтому использование char для математики иногда неизбежно. Поэтому говорить «никогда не следует использовать чар для математики» - это не так. Если бы это было так, более разумное решение должно было включать три типа "char, ubyte, sbyte".

Есть ли причина для этого или это просто странная ошибка обратной совместимости, позволяющая определить плохие (но распространенные) компиляторы как совместимые со стандартом?

Ответы [ 5 ]

26 голосов
/ 27 мая 2009

«Простой» символ с неопределенной подписью позволяет компиляторам выбирать, какое представление более эффективно для целевой архитектуры: на некоторых архитектурах расширение нуля на однобайтовое значение до размера «int» требует меньше операций (таким образом, делая plain char 'unsigned'), в то время как для других набор инструкций делает расширение знака более естественным, а обычный char выполняется как подписанный.

12 голосов
/ 27 мая 2009

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

6 голосов
/ 27 мая 2009

в те старые добрые времена было определено C, мир символов был 7-битным, поэтому бит знака можно было использовать для других вещей (например, EOF)

1 голос
/ 08 декабря 2010

На некоторых машинах символ со знаком будет слишком мал, чтобы вместить все символы в наборе символов C (буквы, цифры, стандартная пунктуация и т. Д.). На таких машинах символ 'char' должен быть без знака. На других машинах беззнаковый символ может содержать значения, превышающие знаковое int (поскольку char и int имеют одинаковый размер). На этих машинах 'char' должен быть подписан.

0 голосов
/ 27 мая 2009

Я полагаю (из головы), что их мышление было следующим:

Если вы заботитесь о знаке символа (используя его как байт), вам следует явно выбрать знаковый или неподписанный символ.

...