Существуют ли машины, где sizeof (char)!= 1 или, по крайней мере, CHAR_BIT> 8?

Существуют ли машины (или компиляторы), где sizeof(char) != 1?

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

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

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

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

Ответ 1

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

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

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

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

Изменить: в ответ на ваш обновленный вопрос, следующий вопрос и ответ от Харбисона и Стил актуальны (там же, глава 4 главы 6):

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

Ответ (ibid, стр. 382):

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

В то время как это конкретно не касается случая, когда, скажем, байты составляют 8 бит, а char - 4 из этих байтов (фактически невозможно с определением c99, см. ниже), тот факт, что sizeof(char) = 1 всегда ясно из c99 и Harbison и 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.

Ответ 2

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

Обновление2: Но результат sizeof не является BYTES! это размер CHAR. И char может может быть 2 байта или (может быть) 7 бит?

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

Ответ 3

PDP-10 и PDP-11.

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

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

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