Есть ли машины, где sizeof (char)! = 1 или хотя бы CHAR_BIT> 8? - PullRequest
89 голосов
/ 07 февраля 2010

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

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

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

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

Update3: Хорошо. Все машины имеют sizeof(char) == 1. Но какие машины имеют CHAR_BIT > 8?

Ответы [ 3 ]

89 голосов
/ 07 февраля 2010

Это всегда один в C99, раздел 6.5.3.4:

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

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

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

Редактировать: В ответ на ваш обновленный вопрос уместны следующий вопрос и ответ от Харбисона и Стила (там же, пример 4 из главы 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 всегда ясно из Стандарт С99 и Харбисон и Стил.

Редактировать: На самом деле (это ответ на ваш вопрос об обновлении 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.

18 голосов
/ 07 февраля 2010

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

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

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

9 голосов
/ 07 февраля 2010

PDP-10 и PDP-11 было.

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

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

Обновление: существует GCC 3.2 для PDP-10 с CHAR_BIT = 9 (отметьте в этом архиве файл include / limit.h).

...