Чар подписан или не подписан по умолчанию?

В книге "Полная справка о С" упоминается, что char по умолчанию без знака.

Но я пытаюсь проверить это с помощью GCC, а также Visual Studio. Он принимает его как подписанный по умолчанию.

Который правильный?

7 ответов

Решение

Книга не права. Стандарт не указывает, является ли простой char подписан или не подписан.

Фактически, стандарт определяет три различных типа: char, signed char, а также unsigned char, если ты #include <limits.h> а затем посмотрите на CHAR_MIN, вы можете узнать, если равнина char является signed или же unsigned (если CHAR_MIN меньше 0 или равно 0), но даже в этом случае три типа различаются в отношении стандарта.

Как указывает Алок, стандарт оставляет это до реализации.

Для gcc по умолчанию подписано, но вы можете изменить это с -funsigned-char, примечание: для gcc в Android NDK по умолчанию используется без знака. Вы также можете явно запросить подписанные символы с -fsigned-char,

На MSVC значение по умолчанию подписано, но вы можете изменить его с помощью /J,

C99 N1256 черновик 6.2.5/15 "Типы" имеет это сказать о подписи типа char:

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

и в сноске:

CHAR_MIN, определенный в <limits.h>, будет иметь одно из значений 0 или же SCHAR_MIN, и это может быть использовано для различения двух вариантов. Независимо от сделанного выбора, char это отдельный тип от двух других и не совместим ни с одним из них.

В соответствии со стандартом C подпись простого char - это "определение реализации".

В общем, разработчики выбирали тот, который был бы более эффективен для реализации на их архитектуре. На системах x86 char обычно подписывается. В системах arm это вообще без знака (Apple iOS - исключение).

В соответствии с книгой языка программирования C Дениса Ритчи, которая является де-факто стандартной книгой для ANSI C, простые символы, подписанные или неподписанные, зависят от машины, но печатные символы всегда положительны.

Теперь мы знаем, что стандарт оставляет это до реализации.

Но как проверить тип signed или же unsigned, такие как char?

Я написал макрос для этого:

#define IS_UNSIGNED(t) ((t)~1 > 0)

и проверить это с gcc, clang, а также cl, Но я не уверен, что это всегда безопасно для других случаев.

Согласно "Языку программирования C++" Бьярна Страуструпа, char является "определенной реализацией". Может быть signed char или же unsigned char в зависимости от реализации. Вы можете проверить, char подписано или нет с помощью std::numeric_limits<char>::is_signed,

Другие вопросы по тегам