Подтвердить что ты не робот

Будет ли `char` всегда-всегда всегда иметь 8 бит?

Я всегда предполагал:

  • что a char представляется байтом,
  • что байт всегда может рассчитывать на наличие 8 бит,
  • что sizeof (char) всегда 1,
  • и что максимальный теоретический объем памяти, которую я могу выделить (подсчитан в char s), - это количество байтов ОЗУ (+ пространство подкачки).

Но теперь, когда я прочитал запись Википедии в байте, я больше не уверен.

Какая из моих предположений неверна? Какой из них опасен?

4b9b3361

Ответ 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` 

Это выражение включает в себя биты дополнений, а также биты значения и знака.