В книге «Полный справочник C» упоминается, что char
по умолчанию без знака.
Но я пытаюсь проверить это с помощью GCC, а также с Visual Studio. Он принимает его как подписанный по умолчанию.
Который правильный?
Книга неверна. В стандарте не указывается, подписан ли простой char
или нет.
Фактически, стандарт определяет три разных типа: char
, signed char
и unsigned char
. Если вы #include
а затем посмотрите на CHAR_MIN
, вы можете узнать, signed
ли обычный char
или нет (если CHAR_MIN
меньше 0 или равно 0), но даже тогда три типа различаются как далеко как стандарт.
Как указывает Алок, стандарт оставляет это до реализации.
Для gcc по умолчанию подписан, но вы можете изменить его с помощью -funsigned-char
. note Примечание: для gcc в Android NDK по умолчанию не указано . Вы также можете явно запросить подписанные символы с -fsigned-char
.
В MSVC по умолчанию подписан, но вы можете изменить это с помощью /J
C99 N1256 проект 6.2.5 / 15 «Типы» имеет это сказать о подписанности типа char
:
Реализация должна определять char для того, чтобы иметь тот же диапазон, представление и поведение в виде либо подписанного символа, либо символа unsigned.
и в сноске:
CHAR_MIN
, определенный в, будет иметь одно из значений
0
илиSCHAR_MIN
, и это можно использовать для различения двух параметров. Независимо от выбранного выбора,char
является отдельным типом от двух других и не совместим ни с одним из них.
Согласно книге программирования языка программирования C от Dennis Ritchie, которая является стандартной базой для ANSI C, простые символы, подписанные или неподписанные, зависят от машины, но печатные символы всегда положительны.
В соответствии со стандартом C подпись четного символа является «реализацией определенной».
В целом разработчики выбрали то, что было более эффективным для реализации в своей архитектуре. В системах x86 char обычно подписывается. На консольных системах он обычно не подпадает под действие (Apple iOS является исключением).
Согласно «Язык программирования C ++» Бьярне Страуструпа, char
является «реализацией». Он может быть signed char
или unsigned char
зависимости от реализации. Вы можете проверить, подписан ли char
или нет, используя std::numeric_limits
.