Чар подписан или не подписан по умолчанию? - PullRequest
133 голосов
/ 13 января 2010

В книге «Полная ссылка на C» упоминается, что char по умолчанию не подписано.

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

Какой из них правильный?

Ответы [ 7 ]

174 голосов
/ 13 января 2010

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

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

59 голосов
/ 13 января 2010

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

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

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

32 голосов
/ 13 января 2010

C99 N1256 черновик 6.2.5 / 15 «Типы» говорят о подписи типа char:

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

и в сноске:

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

7 голосов
/ 31 июля 2012

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

6 голосов
/ 23 ноября 2016

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

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

2 голосов
/ 22 декабря 2016

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

0 голосов
/ 20 декабря 2018

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

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...