Есть ли машины, где sizeof (char)!= 1, или хотя бы CHAR бит> 8?
есть ли машины (или компиляторы), где sizeof(char) != 1
?
тут стандарт C99 говорит, что sizeof(char)
при стандартном соблюдении реализация должна быть ровно 1? Если это так, пожалуйста, дайте мне номер раздела и цитату.
обновление:
Если у меня есть машина (CPU), которая не может адресовать байты (минимальное чтение-4 байта, выровнено), но только 4-S байтов (uint32_t
),может ли компилятор для этой машины определить sizeof(char)
в 4?sizeof(char)
будет 1, но char будет иметь 32 бита (CHAR_BIT
макросы)
обновление 2: Но результат sizeof-это не байт ! это размер CHAR. И char может быть 2 байта, или (может быть) 7 бит?
Update3:
Ладно. Все машины имеют sizeof(char) == 1
. Но какие машины есть CHAR_BIT > 8
?
3 ответа:
это всегда один в C99, раздел 6.5.3.4:
при применении к операнду, который имеет введите char, unsigned char или signed char, (или его квалифицированная версия) результат 1.
Edit: не часть вашего вопроса, но для интереса от Harbison и Steele, 3-е изд. (pre c99) p. 148:
блок памяти принят для того чтобы быть объем памяти, занимаемой одним характер, размер объекта тип
char
поэтому 1.Edit: в ответ на ваш обновленный вопрос уместен следующий вопрос и ответ от Harbison and Steele (там же, Ex. 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
всегда ясно из стандарта c99 и Харбисона и Стила.Edit: на самом деле (это в ответ на ваш вопрос upd 2), Что касается c99
sizeof(char)
и в байтах, из раздела 6.5.3.4 снова:оператор sizeof дает размер (в байтах) его операнда
так в сочетании с цитатой выше, байты 8 бит и
char
поскольку 4 из этих байтов невозможно: для c99 байт такой же, как achar
.в ответ на ваше упоминание о возможности 7 бит
char
: это невозможно в c99. В соответствии с разделом 5.2.4.2.1 стандарт минимум в 8:их значения, определенные реализацией, должны быть равны или более [мой акцент] по величине, как показано, с тем же знаком.
- количество битов для самого маленького объекта, который не является битовым полем (байтом)
**CHAR_BIT 8**
- минимальный значение для объекта типа signed char
**SCHAR_MIN -127//−(27−1)**
- максимальное значение для объекта типа signed 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.
нет машин, где
sizeof(char)
в 4. Это всегда 1 байт. Что байт может содержать 32 бита, но что касается компилятора C, это один байт. Для получения более подробной информации, я на самом деле собираюсь указать вам на C++ FAQ 26.6. Эта ссылка охватывает его довольно хорошо, и я довольно уверен, что C++ получил все эти правила от C. Вы также можете посмотреть на comp.ленг.C FAQ 8.10 для символов размером более 8 бит.Upd2: но sizeof результатом является не байт ! это размер CHAR. И чар может быть 2 байта, или (может быть) 7 бит?
Да, это байт. Позвольте мне сказать это еще раз.
sizeof(char)
- 1 байт в соответствии с компилятором Си. То, что люди в разговорной речи называют байтом (8 бит), не обязательно совпадает с тем, что компилятор C называет байтом. Количество бит в байте зависит от архитектуры машины. Это также гарантированно будет не менее 8.
PDP-10
и PDP-11было.обновление:
там как нет компиляторов C99 для PDP-10.некоторые модели аналоговых устройств 32-битного SHARC DSP имеют CHAR_BIT=32, а Texas Instruments DSP от TMS32F28xx имеют CHAR_BIT=16,.
обновление: есть GCC 3.2 для PDP-10 С CHAR_BIT=9 (проверьте Включить / ограничения.ч в этом архиве).