Чар подписан или не подписан по умолчанию?
В книге "Полная справка о С" упоминается, что 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
,