2009-05-27 2 views
20

В C стандартные состояния:Почему знак символа не определен в C?

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

Три типа CHAR, подписанный символ, и символ без знака в совокупности называются характер типы. Реализация должна определять символ , имеющий тот же диапазон, представление, и поведение как знак с фиксированным знаком, либо unsigned char.

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

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

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

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

+0

[Любой компилятор, который принимает «char» как «unsigned»?] (Http://stackoverflow.com/q/3728045/995714) –

ответ

26

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

+0

Yup, независимо от того, какие аппаратные средства должны быть доступны непосредственно на этом языке, с минимальным липким сахаром в теме. – dkretz

+8

Тогда почему бы не повторить ту же историю для неподписанных/подписанных коротких? он также должен быть расширен до int. –

+0

@ ElazarLeibovich Это проницательный комментарий, но чаще всего обходит проблему полностью, делая «короткий» того же размера, что и «int» (например, как 16-разрядный), чем сделать «char» того же размера, что и 'int', хотя оба они допускаются стандартами C, и оба они существуют в дикой природе. И подпись «char» не кажется важной, как подписанность «короткого», делая компромисс более приемлемым. –

0

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

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

+0

Unsigned пришел позже; подписанный пришел намного позже, чем это. –

12

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

+6

Правильно. В текущем мире, где каждый процессинг либо x86, Power или Sparc, его трудно переоценить, что в hte 70-х были десятки процессоров, доступных с разными архитектурами. От элегантной симпликации 8 бит DEC до монстров берут 36 бит бегемотов. Согласован даже размер персонажа - машины XEROX работали с 6-битным набором символов. –

+0

Почему машина заботится о персонаже? Была ли команда ЦП выдавать символы?Я не знаю ничего такого в x86. –

+1

Да, причина была историческая. И тогда, поскольку у нас был неподписанный char/signed char/plain char - по причинам симметрии мы также подписали int/short - даже несмотря на то, что подписанные для других целочисленных типов избыточные. Таким образом, в основном есть намерение четко определить знак, но это не может случиться больше для символа - слишком много кода сломается –

6

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

0

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

Смежные вопросы