Есть ли машины, где 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 "байты" и "символы" означают одно и то же - наименьшую единицу памяти.