Гарантируется ли 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/