Гарантируется ли длина символа ровно в 8 бит?

Вот и все. Не нашел ни одной подобной темы, так что потерпите меня.

вопрос задан 19.05.2009
Ori Popowski
3975 репутация

7 ответов


  • 45 рейтинг

    От копия спецификации ANSI C , см. Раздел 3. 1. 2. 5 - Типы :

    Объект, объявленный как тип char достаточно большой, чтобы хранить любой член основной набор символов выполнения. Если член требуемого источника набор символов, перечисленных в $ 2. 2. 1 является хранится в объекте char, его значение гарантированно будет положительным. Если другой количества хранятся в символе объект, поведение определяется реализацией: значения считается подписанным или неотрицательные целые числа.

    Понятие «набор символов выполнения» введено в разделе , раздел 2. 2. 1 - Наборы символов .

    Другими словами, символ должен быть, по крайней мере, достаточно большим, чтобы содержать кодировку, по крайней мере, из 95 различных символов, которые составляют основной набор символов выполнения.

    Теперь добавьте к этому раздел 2. 2. 4. 2 - Числовые пределы

    Соответствующая реализация должна документировать все ограничения, указанные в этот раздел, который должен быть указан в заголовках и .

    Размеры интегральных типов

    Значения, приведенные ниже, должны быть заменены постоянными выражениями подходит для использования в #if предварительной обработке директивы. Их определенные реализацией значения должны быть равный или больший по величине (абсолютное значение) к показанным, с тот же знак.

    • максимальное количество бит для самых маленьких объект, который не является битовым полем (байт)
      CHAR_BIT 8

    • минимальное значение для объекта типа подписанный символ
      SCHAR_MIN -127

    • максимальное значение для объекта типа подписанный символ
      SCHAR_MAX +127

    • максимальное значение для объекта типа символ без знака
      UCHAR_MAX 255

    . , , ,

    Итак, у вас это есть - количество битов в символе должно быть не менее 8.

    ответ дан Paul Dixon, с репутацией 234700, 19.05.2009
  • 12 рейтинг

    Нет, он не гарантированно будет 8-разрядным. sizeof (char) гарантированно равен 1, но это не обязательно означает один 8-битный байт.

    ответ дан does_not_exist, с репутацией , 19.05.2009
  • 11 рейтинг

    нет, тип данных char должен содержать не менее 8 бит (см. Спецификацию ANSI C)

    ответ дан dfa, с репутацией 91372, 19.05.2009
  • 7 рейтинг

    Черновик стандарта C99 гласит, что байт должен иметь ширину не менее 8 бит, потому что содержит макрос CHAR_BIT, который выдает число бит на байт и гарантированно будет по крайней мере 8 (§5. 2. 4. 2. 1).

    Проект стандарта C ++ включает C под названием (§18. 2. 2).

    ответ дан Bastien Léonard, с репутацией 42267, 19.05.2009
  • 3 рейтинг

    Давайте посмотрим, что именно говорит стандарт:

    5. 2. 4. 2. 1 Размеры целых типов
    , , ,
    Их определяемые реализацией значения должны быть равны или больше по величине (абсолютное значение) к показанным с тем же знаком.


    количество бит для самых маленьких объект, который не является битовым полем (байт)
    CHAR_BIT 8

    Это говорит нам о том, что байт не менее 8 бит (параграф чуть выше

    Если значение объекта типа char рассматривается как целое число со знаком, когда используется в выражении, значение CHAR_MIN должен совпадать с SCHAR_MIN и значение CHAR_MAX должны быть такими же, как у SCHAR_MAX. В противном случае значение CHAR_MIN должен быть 0, а значение CHAR_MAX должен быть таким же, как UCHAR_MAX. Значение UCHAR_MAX должно равно 2 ^ CHAR_BIT - 1


    Для каждого из целых типов со знаком, есть соответствующий (но разные) целое число без знака (обозначается ключевым словом unsigned) который использует тот же объем памяти (включая информацию о знаках) и имеет одинаковые требования к выравниванию.


    Для беззнаковых целочисленных типов, отличных от unsigned char, биты объекта представление должно быть разделено на две группы: биты значения и биты заполнения (там необходимо не будь ни одного из последних).

    Эти отрывки говорят нам, что:

    • беззнаковый символ должен представлять 2 ^ CHAR_BIT-1 значения, которые могут быть закодированы на минимальных битах CHAR_BIT (в соответствии с традиционным представлением битов, которое предписано стандартом)
    • беззнаковый символ не содержит никаких дополнительных (отступных) бит
    • подписанный символ занимает то же место, что и неподписанный символ.
    • char реализуется так же, как char со знаком или без знака

    Вывод: символ и его варианты: беззнаковый символ и подписанный символ гарантированно имеют размер в байтах, а ширина байта не менее 8 бит.

    Теперь они являются другими признаками (но не формальным доказательством, как указано выше), что символ действительно является одним байтом:

    За исключением битовых полей, объекты состоит из последовательных последовательностей один или несколько байтов, номер, порядок и кодировка которых либо явно указано, либо реализации.


    Значения, хранящиеся в объектах без битовых полей любого другого типа объекта, состоят из n × CHAR_BIT биты, где n - размер объекта этого типа в байтах. Значение может быть скопировано в объект типа unsigned char [n]


    Оператор sizeof возвращает размер (в байтах) своего операнда, который может быть выражение или заключенное в скобки имя типа. Размер определяется по типу операнд. Результатом является целое число. Если тип операнда является массивом переменной длины тип, операнд оценивается; в противном случае, операнд не оценивается, а результат целочисленная константа.


    При применении к операнду с типом char, без знака или со знаком, (или его квалифицированная версия) результат равен 1. При применении к операнду, который имеет массив тип, результатом является общее количество байтов в массиве. 88) Применительно к операнду который имеет структуру или тип объединения, результатом является общее количество байтов в таком объекте, в том числе внутренняя и задняя обивка.

    (Обратите внимание, что здесь есть двусмысленность. Заменяет ли sizeof (char) здесь правило sizeof (типа) или оно просто приводит пример? )

    Тем не менее, есть проблема, которую нужно решить. Что именно является байтом? Согласно стандарту это «самый маленький объект, который не является битовым полем». Обратите внимание, что теоретически это может не соответствовать машинному байту , и что существует также двусмысленность в отношении того, что называется «машинным байтом»: он может независимо от того, что конструкторы называют «байтом», зная, что каждый конструктор может иметь другое определение «байт»; или общее определение, такое как «последовательность битов, которую компьютер обрабатывает в отдельных единицах» или «наименьшая адресуемая часть данных».

    Например, машина, которая имеет 7-битные байты, должна была бы реализовать «C-байт» как два машинных байта.

    Источник всех ссылок: Проект комитета - 7 сентября 2007 г. ИСО / МЭК 9899: ТС3 .

    ответ дан Norswap, с репутацией 4263, 29.01.2011
  • 1 рейтинг

    Из стандарта C, описывающего пределы. ч (требуется некоторое переформатирование):

    1. количество бит для наименьшего объекта это не битовое поле (байт): CHAR_BIT 8
    2. минимальное значение для объекта типа подписанный символ: SCHAR_MIN -127
    3. максимальное значение для объекта типа подписанный символ: SCHAR_MAX +127

    CHAR_BIT минимум 8 гарантирует, что символ имеет ширину не менее 8 бит. Диапазоны в SCHAR_MIN и SCHAR_MAX гарантируют, что представление подписанного символа использует по крайней мере восемь битов.

    ответ дан dek, с репутацией 11, 19.05.2009
  • -2 рейтинг

    Первое, что я хотел бы сказать, это то, что если вам нужно, чтобы тип был точным числом битов, используйте тип, определенный по размеру. В зависимости от вашей платформы это может варьироваться от __s8 для 8-битного типа со знаком в Linux до __int8 в VC ++ в Windows.

    Теперь, согласно Роберту Лаву в своей главе о переносимости в «Linux Kernel Development», он заявляет, что стандарт C «оставляет размер стандартных типов до реализаций, хотя он диктует минимальный размер. "

    Затем в сноске внизу страницы он говорит: «За исключением char, который всегда равен 8 битам»

    Теперь я не уверен, на чем он основывается, но, может быть, именно этот раздел из спецификации ANSI C ?

    2. 2. 4. 2 Числовые пределы

    Соответствующая реализация должна документировать все указанные ограничения в этом разделе, который должен быть указан в пределах заголовков. час и плавать. ч

    "Размеры пределов целочисленных типов. ч "

    Значения, приведенные ниже, должны быть заменены постоянными выражениями подходит для использования в директивах предварительной обработки #if. Их определенные реализацией значения должны быть равны или больше по величине (абсолютное значение) к показанным с тем же знаком.

    максимальное количество бит для наименьшего объекта, который не является битовым полем (байт)

    CHAR_BIT 8

    минимальное значение для объекта типа подписанного символа

    SCHAR_MIN -127

    максимальное значение для типа объекта со знаком char

    SCHAR_MAX +127

    максимальное значение для объекта типа unsigned char

    UCHAR_MAX 255

    минимальное значение для объекта типа char

    CHAR_MIN см. Ниже

    максимальное значение для объекта типа char

    CHAR_MAX см. Ниже

    максимальное количество байтов в многобайтовом символе для любой поддерживаемой локали

    MB_LEN_MAX 1

    минимальное значение для объекта типа short int

    SHRT_MIN -32767

    максимальное значение для объекта типа short int

    SHRT_MAX +32767

    максимальное значение для объекта типа unsigned short int

    USHRT_MAX 65535

    минимальное значение для объекта типа int

    INT_MIN -32767

    максимальное значение для объекта типа int

    INT_MAX +32767

    максимальное значение для объекта типа unsigned int

    UINT_MAX 65535

    минимальное значение для объекта типа long int

    LONG_MIN -2147483647

    максимальное значение для объекта типа long int

    LONG_MAX +2147483647

    максимальное значение для объекта типа unsigned long int

    ULONG_MAX 4294967295

    Если значение объекта типа char sign-extends при использовании в В выражении значение CHAR_MIN должно быть таким же, как SCHAR_MIN и значение CHAR_MAX должно быть таким же, как SCHAR_MAX. Если значение объекта типа char не расширение знака при использовании в выражении, значение CHAR_MIN должно быть 0 и значение CHAR_MAX должно быть таким же, как и значение UCHAR_MAX , / 7/

    ответ дан Robert S. Barnes, с репутацией 26820, 19.05.2009