Есть ли машины, где sizeof (char)! = 1 или хотя бы CHAR_BIT & gt; 8?

Есть машины (или компиляторы), где sizeof(char) != 1?

Указывает ли C99 стандарт , что sizeof(char) для реализации соответствия стандартам ДОЛЖНО быть ровно 1? Если да, пожалуйста, дайте мне номер раздела и ссылку.

Обновление: Если у меня есть машина (ЦП), которая не может адресовать байты (минимальное чтение составляет 4 байта, выровнено), но только 4 байта (uint32_t), может ли компилятор для этой машины определить sizeof(char) для 4? sizeof(char) будет 1, но у char будет 32 бита (CHAR_BIT макросов)

Обновление 2: Но размер результата НЕ БАЙТЫ! это размер ЧАР. А char может быть 2 байта или (может быть) 7 бит?

Обновление 3: Хорошо. Все машины имеют sizeof(char) == 1. Но какие машины есть у CHAR_BIT > 8?

вопрос задан 7.02.2010
osgx
55598 репутация

3 ответов


  • 87 рейтинг

    Это всегда один в C99, раздел 6. 5. 3. 4:

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

    Редактировать: не часть вашего вопроса, но для интереса от Harbison и Steele, 3-е изд. (до c99) стр. 148:

    Единицей хранения считается объем памяти, занимаемый одним персонаж; размер объекта поэтому тип char равен 1.

    Редактировать: В ответ на ваш обновленный вопрос, следующий вопрос и ответ от Harbison и Steele имеют отношение (там же, Ex. 4 из Ch. 6):

    Допустимо ли иметь C реализация, в которой тип char может представлять значения в диапазоне от От 2 147 483 648 до 2 147 483 647? Если так, то что будет sizeof(char) в соответствии с этой реализацией? Что бы быть самым маленьким и самым большим диапазоном Тип int?

    Ответ (там же, с. 382):

    Это разрешено (если расточительно) для реализация использовать 32 бита для представляют тип char. Невзирая на реализация, стоимость sizeof(char) всегда 1.

    Хотя это не относится конкретно к случаю, когда, скажем, байты являются 8 битами, а char являются 4 из этих байтов (фактически невозможно с определением c99, см. Ниже), тот факт, что sizeof(char) = 1 всегда ясен из стандарта c99 и Harbison and Steele ,

    Редактировать: На самом деле (это в ответ на ваш вопрос об обновлении 2), что касается c99 sizeof(char) в байтах из раздела 6. 5. 3. 4 снова:

    Оператор sizeof возвращает размер (в байтах) его операнда

    , объединенный с приведенной выше цитатой, невозможно: байты 8 битов и char как 4 из этих байтов невозможны: для c99 байт такой же, как char.

    В ответ на ваше упоминание о возможности 7-битного char: это невозможно в c99. Согласно разделу 5. 2. 4. 2. 1 стандарта минимум составляет 8:

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

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

     **CHAR_BIT 8**
    

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

    **SCHAR_MIN -127//−(27−1)** 
    

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

    **SCHAR_MAX +127//27−1** 
    

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

    **UCHAR_MAX 255//28−1** 
    

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

    **CHAR_MIN**    see below 
    

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

    **CHAR_MAX**    see below
    

    [. , , ]

    Если значение объекта типа char рассматривается как целое число со знаком, когда используется в выражении, значение CHAR_MIN должен совпадать с SCHAR_MIN и значение CHAR_MAX должны быть такими же, как у SCHAR_MAX. В противном случае значение CHAR_MIN должен быть 0, а значение CHAR_MAX должен быть таким же, как UCHAR_MAX. Значение UCHAR_MAX должно быть равно 2 ^ CHAR_BIT - 1.

    ответ дан Ramashalanka, с репутацией 7329, 7.02.2010
  • 15 рейтинг

    Нет машин, где sizeof(char) - 4. Это всегда 1 байт. Этот байт может содержать 32 бита, но для компилятора C это один байт. Для более подробной информации, я собираюсь указать вам на C ++ FAQ 26. 6 . Эта ссылка достаточно хорошо освещена, и я уверен, что C ++ получил все эти правила от C. Вы также можете посмотреть на комп. яз. c FAQ 8. 10 для символов размером более 8 бит.

    Upd2: Но размер результата НЕ БАЙТЫ ! это размер ЧАР. И чар может быть 2 байта или (может быть) 7 бит?

    Да, это байты. Позвольте мне сказать это снова. sizeof(char) составляет 1 байт в соответствии с компилятором C. То, что люди обычно называют байтом (8 битов), не обязательно совпадает с тем, что компилятор C называет байтом. Количество битов в байте C зависит от архитектуры вашего компьютера. Также гарантированно будет не менее 8.

    ответ дан Michael Kristofik, с репутацией 25392, 7.02.2010
  • 8 рейтинг

    PDP-10 и PDP-11 .

    Обновление: там, как нет компиляторов C99 для PDP-10.

    Некоторые модели 32-разрядных процессоров SHARC для аналоговых устройств имеют CHAR_BIT = 32, и DSP Texas Instruments из TMS32F28xx имеют CHAR_BIT = 16, , по сообщениям, .

    Обновление: есть GCC 3. 2 для PDP-10 с CHAR_BIT = 9 (проверьте, включают / ограничивает. ч в этом архиве).

    ответ дан osgx, с репутацией 55598, 7.02.2010