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

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

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

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

вопрос задан 13.01.2010
C Learner
841 репутация

6 ответов


  • 162 рейтинг

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

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

    ответ дан Alok Singhal, с репутацией 64480, 13.01.2010
  • 57 рейтинг

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

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

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

    ответ дан R Samuel Klatchko, с репутацией 62978, 13.01.2010
  • 29 рейтинг

    C99 N1256 осадка 6. 2. 5/15 "Типы" имеют это сказать о подписи типа char:

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

    и в сноске:

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

    ответ дан Michael Burr, с репутацией 277528, 13.01.2010
  • 7 рейтинг

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

    ответ дан Ravi Rathi, с репутацией 79, 31.07.2012
  • 5 рейтинг

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

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

    ответ дан plugwash, с репутацией 4092, 23.11.2016
  • 3 рейтинг

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

    ответ дан BoQ, с репутацией 79, 21.12.2016