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

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

Ответ 1

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

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

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

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

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

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

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

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

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

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

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

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

....

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

Ответ 2

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

Ответ 3

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

Ответ 4

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

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

Ответ 5

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

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 char, биты объекта представление делится на две группы: биты значений и биты заполнения (необходимо не быть последним).

В этих отрывках говорится, что:

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

Вывод: a char и его варианты без знака char и подписанный char гарантированно будут в точности байтом в размере, а байт будет иметь ширину не менее 8 бит.

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

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


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


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


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

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

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

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

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

Ответ 6

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

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

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

Ответ 7

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

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

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

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

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

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

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

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

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

CHAR_BIT 8

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

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