Является ли char подписанным или неподписанным по умолчанию?

В книге «Полный справочник 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::is_signed .