Подтвердить что ты не робот

Почему знак char не определен в C?

Стандартные состояния C:

ISO/IEC 9899: 1999, 6.2.5.15 (стр. 49)

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

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

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

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

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

4b9b3361

Ответ 1

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

Ответ 2

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

Ответ 3

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

Ответ 4

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

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

Ответ 5

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