Гарантируется ли, что char будет точно 8-битным? [дубликат]


этот вопрос уже есть ответ здесь:

  • Будет ли "char" всегда-всегда-всегда иметь 8 бит? 7 ответов

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

7 57

7 ответов:

С копия спецификации ANSI C см. Раздел 3.1.2.5 - Типа:

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

понятие "набор символов выполнения" вводится в раздел 2.2.1-наборы символов.

теперь добавьте к этому раздел 2.2.4.2 - числовые пределы

A соответствующее осуществление должно документируйте все ограничения, указанные в этот раздел, который должен быть указан в заголовках <limits.h> и <float.h> .

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

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

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

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

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

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

....

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

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

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

в стандартном проекте C99 говорится, что байт должен быть не менее 8-битным, потому что <limits.h> содержит макрос CHAR_BIT который дает количество битов на байт, и гарантированно будет не менее 8 (§5.2.4.2.1).

стандартный проект C++ включает в себя C <limits.h> под названием <climits> (§18.2.2).

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

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 (в соответствии с обычным битовым представлением, которое предписано стандартом)
  • беззнаковый символ не содержит дополнительных (дополняющих) битов
  • знаковый символ занимает ровно столько же места, сколько и беззнаковый символ
  • символ реализуется таким же образом, как и подписанный или неподписанный чар

вывод: символ и его варианты unsigned char и signed char гарантированно будут точно байтом по размеру, а байт гарантированно будет не менее 8 бит в ширину.

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

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


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


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


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

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

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

например, машина, которая имеет 7-битные байты, должны были бы реализовать "c байт" как два байта машины.

источник всех цитат : проект Комитета-7 сентября 2007 ISO / IEC 9899: TC3.

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

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

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

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

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

затем в сноске в нижней части страницы он говорит: "за исключением char это всегда 8 бит"

Теперь я не уверен, на чем он основывает это, но, возможно, это этот раздел От ANSI C spec?

2.2.4.2 численные пределы

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

"размеры Интеграл ограничения типов.h"

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

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

CHAR_BIT 8

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

SCHAR_MIN -127

максимальное значение для объекта типа signed 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-расширяется при использовании в выражение, значение CHAR_MIN должно быть таким же, как и у SCHAR_MIN и значение CHAR_MAX должны быть такими же, как у SCHAR_MAX . Если значение объект типа char не sign-extend при использовании в выражении значение CHAR_MIN должно быть 0 и значение CHAR_MAX должно быть таким же, как у UCHAR_MAX ./7/