Подтвердить что ты не робот

Что считается типом символа в C11?

Что на самом деле относится к "типу символов" в C11 - помимо char, конечно?

Точнее, специальные исключения для типа символа (например, к любому объекту можно получить выражение lvalue типа символа - см. § 6.5/7 в стандарте C11), к которому применяются конкретные типы? Кажется, они относятся к uint8_t и int8_t из stdint.h, но это гарантировано? С другой стороны, gcc не рассматривает char16_t от uchar.h как "характерный тип".

4b9b3361

Ответ 1

Только char, signed char и unsigned char 1.

Типы uint8_t, int8_t, char16_t или любой тип в форме intN_t или charN_t могут быть или не быть синонимами для типа символа.


1 (Цитируется по: ISO/IEC 9899: 201x 6.2.5 Типы 15)
Три типа char, подписанные char и unsigned char совместно называются типами символов.

Ответ 2

char, signed char и unsigned char - это типы символов в C11. Это то же самое с C89.

Обработка int8_t (или uint8_t) в качестве типа символа имеет много проблем.

  • Они не являются обязательными.
  • Они могут не существовать, если CHAR_BIT > 8.
  • Определяется для работы, если в реализации используется 2 представления дополнения (что является наиболее распространенным). Но они представляют собой другие представления, а именно 1 дополнение и знаковое значение, определенные/разрешенные стандартом C.

Поскольку они существуют, если они существуют, typedef'ed для существующего типа, вы, вероятно, можете избежать использования int8_t или uint8_t в качестве типа символа на практике. Но стандарт ничего не гарантирует и нет причин рассматривать их как таковые, когда у вас есть реальные типы символов.