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

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

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

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

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

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

4 ответа

Решение

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

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

Изменить: не часть вашего вопроса, но для интереса из Harbison и Стил, 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 снова:

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

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

В ответ на ваше упоминание о возможности 7 бит char Это невозможно в C99. Согласно разделу 5.2.4.2.1 стандарта минимум составляет 8:

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

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

 **CHAR_BIT 8**

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

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

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

**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.

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

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

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

PDP-10 и PDP-11 был.

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

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

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

То, что вы называете «байтами», лучше называть «октетами». В C "байты" и "символы" означают одно и то же - наименьшую единицу памяти.

Другие вопросы по тегам