Будет ли `char` всегда-всегда всегда иметь 8 бит?
Я всегда предполагал:
- что a
char
представляется байтом,
- что байт всегда может рассчитывать на наличие 8 бит,
- что
sizeof (char)
всегда 1
,
- и что максимальный теоретический объем памяти, которую я могу выделить (подсчитан в
char
s), - это количество байтов ОЗУ (+ пространство подкачки).
Но теперь, когда я прочитал запись Википедии в байте, я больше не уверен.
Какая из моих предположений неверна? Какой из них опасен?
Ответы
Ответ 1
-
Да, char
и byte
почти одинаковы. Байт - это наименьший адресный объем памяти, и поэтому char
в C. char
всегда имеет размер 1.
Из раздела spec, 3,6 байт:
байт
адресуемый блок хранения данных, достаточно большой, чтобы содержать любой элемент базового набора символов среды выполнения
И раздел 3.7.1 символ:
символ
однобайтовый символ
< С > битное представление, которое помещается в байт
-
A char
имеет бит CHAR_BIT
. Это может быть любое число (ну, 8 или больше в соответствии со спецификацией), но, безусловно, чаще всего 8. Существуют реальные машины с 16- и 32-разрядными типами char
. CHAR_BIT
определяется в limits.h
.
В разделе spec, section 5.2.4.2.1 Размеры целых типов <limits.h>
:
Значения, приведенные ниже, должны быть заменены постоянными выражениями, подходящими для использования в директивах pre-processing #if
. Кроме того, кроме CHAR_BIT
и MB_LEN_MAX
, заменяются выражения, которые имеют тот же тип, что и выражение, являющееся объектом соответствующего типа преобразованный в соответствии с целыми рекламными акциями. Их значения, определяемые реализацией, должны быть равны или больше по величине (по абсолютной величине) тем, которые показаны, с тем же знаком.
- количество бит для наименьшего объекта, который не является битовым полем (байтом)
CHAR_BIT
8
-
sizeof(char) == 1
. Всегда.
Из спецификации, раздела 6.5.3.4 Оператор sizeof
, пункт 3:
При применении к операнду, который имеет тип char
, unsigned char
или signed char
(или квалифицированная версия из этого) результат равен 1.
-
Вы можете выделить столько памяти, сколько ваша система позволит вам выделить - в стандарте нет ничего, что бы определяло, насколько это возможно. Вы могли бы представить себе, например, компьютер с системой резервирования памяти с облачным хранилищем - ваша распределяемая память может быть практически бесконечной.
Здесь полный раздел справки 7.20.3.3 Функция malloc
:
Сводка
1 #include <stdlib.h>
void *malloc(size_t size);
Описание
2 Функция malloc
выделяет пространство для объекта, размер которого определяется size
и значение которого неопределенно.
Возвращает
3 Функция malloc
возвращает либо нулевой указатель, либо указатель на выделенное пространство.
Это полная спецификация, поэтому на самом деле нет ограничений, на которые вы можете положиться.
Ответ 2
sizeof(char)
определяется как всегда 1
. С C99:
При применении к операнду с типом char, unsigned char или подписанным char (или его соответствующей версией) результат равен 1.
Однако не гарантируется 8 бит. На практике, на подавляющем большинстве платформ там, это будет, но нет, вы не можете с технической точки зрения рассчитывать на это, чтобы всегда было так (и это не имеет значения, поскольку вы должны использовать sizeof
) в любом случае.
Ответ 3
sizeof(char)
всегда 1 байт. Байт, однако, не всегда один октет: Texas Instruments TI C55x, например, представляет собой DSP с 16-разрядным байтом.
Ответ 4
Традиционно байт не обязательно 8 бит, а просто маленький область памяти, обычно подходящая для хранения одного символа. С Стандарт следует за этим использованием, поэтому байты, используемые malloc и sizeof может быть более 8 бит. [сноска] (Стандарт не позволяет им быть меньше.)
Но sizeof (char) всегда 1.
Запоминание C FAQ - это продвижение по карьерной лестнице.
Ответ 5
В C a char всегда один байт, поэтому ваши первые и третьи предположения верны.
Байт не всегда 8 бит, поэтому ваше второе предположение не всегда выполняется. Тем не менее, >= 99,99% всех существующих в настоящее время систем имеют 8-битные символы, поэтому много кода неявно предполагает 8-битные символы и отлично работает на всех целевых платформах. Конечно, машины Windows и Mac всегда используют 8-битные символы, а также AFAIK Linux (Linux портирован на столько платформ, что я не уверен на 100%, что кто-то не перенес Linux на платформу, где 9-битные символы имеют смысл).
Максимальный объем памяти, который может быть выделен, - это размер виртуальной памяти, минус зарезервированное для операционной системы пространство.
Ответ 6
Конкретно, некоторые архитектуры, особенно в поле DSP, имеют char: s больше 8 бит. На практике они жертвуют памятью для скорости.
Ответ 7
Несчастная вещь (или, может быть, удачная, в зависимости от того, как вы оцениваете вещи) состоит в том, что идея того, что байт обычно считается (8 бит), не является синонимом того, что язык программирования C считает байтом. Рассматривая некоторые из предыдущих ответов, байт имеет точное определение, когда речь заходит о языке программирования C, и нигде в определении не упоминается байт, состоящий из 8 бит. Он просто упоминает, что байт
"адресная единица хранения данных, достаточно большая, чтобы содержать любого члена базовый набор символов среды выполнения."
Итак, чтобы ответить на ваш вопрос: "Будет ли char
всегда - всегда - всегда иметь 8 бит", ответ не всегда, но чаще всего это будет. Если вы заинтересованы в том, чтобы точно узнать, сколько бит пространства, которое ваши типы данных потребляют в вашей системе, вы можете использовать следующую строку кода:
sizeof(type) * CHAR_BIT
Где type
- ваш тип данных. Например, чтобы узнать, сколько бит a char
используется в вашей системе, вы можете использовать следующее:
printf("The number of bits a 'char' has on my system: %zu\n", sizeof(char) * CHAR_BIT);
Это взято из Справочного руководства по библиотеке GNU C, которое содержит следующее освещающее объяснение по этой теме:
На языке C нет оператора, который может дать вам количество бит в целочисленном типе данных. Но вы можете вычислить его из макроса CHAR_BIT, определенный в файле заголовка header.h. CHAR_BIT - это количество бит в char -eight, в большинстве систем. Значение имеет тип внутр. Вы можете вычислить количество бит в любом типе типа данных, например это:
`sizeof (type) * CHAR_BIT`
Это выражение включает в себя биты дополнений, а также биты значения и знака.