Есть ли машины (или компиляторы), где sizeof(char) != 1
?
Делает стандарт C99, говорит это sizeof(char)
на стандартном соответствии реализация ДОЛЖНА быть точно 1? Если это делает, дайте мне число раздела и цитату.
Обновление: Если у меня есть машина (ЦП), который не может адресные байты (минимальное чтение составляет 4 байта, выровненные), но только 4-s байтов (uint32_t
), может компилятор для этой машины определять sizeof(char)
к 4?sizeof(char)
будет 1, но символ будет иметь 32 бита (CHAR_BIT
макросы)
Update2: Но результатом sizeof НЕ являются БАЙТЫ! это - размер CHAR. И символ может составить 2 байта, или (может быть), 7 битов?
Update3: хорошо. Все машины имеют sizeof(char) == 1
. Но что имеют машины CHAR_BIT > 8
?
Это всегда единица в C99, раздел 6.5.3.4:
При применении к операнду, имеющему тип char, unsigned char , или подписанный char, (или его квалифицированная версия) результат 1.
Изменить: не часть вашего вопроса, а интерес Харбисона и Стила, 3-е изд. (pre c99) стр. 148:
Под единицей хранения понимается объем памяти, занимаемый одним символом ; размер объекта типа
char
, следовательно, равен 1.
Изменить: В ответ на ваш обновленный вопрос уместен следующий вопрос и ответ от Харбисона и Стила (там же, 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 и Харбисона и Стила.
Редактировать: Фактически (это ответ на ваш вопрос об UPD 2), что касается c99 sizeof (char)
составляет в байтах, снова из раздела 6.5.3.4:
Оператор sizeof дает размер (в байтах) его операнда
в сочетании с приведенной выше цитатой, байты из 8 бит и char
, поскольку 4 из этих байтов невозможны: для c99 байт совпадает с символ
.
В ответ на ваше упоминание о возможности 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
{ {1}}
[...]
Если значение объекта типа char обрабатывается как целое число со знаком, когда используется в выражении , значение CHAR_MIN должно быть таким же, как и значение SCHAR_MIN, а значение CHAR_MAX должно быть таким же, как и значение SCHAR_MAX. В противном случае значение CHAR_MIN должно быть 0, а значение CHAR_MAX должно быть таким же, как и значение UCHAR_MAX. Значение UCHAR_MAX должно быть равно 2 ^ CHAR_BIT - 1.
Я думаю, что это должно сделать трюк:
-121--2938619-preg _ match ('/^ [a-zA-Z0-9] {4,30} $/', $ psword);
Вы должны захватить копию Mac OS X Internals , которая является потрясающей книгой обо всем, что Apple не говорит вам. Это не только здорово, если вы заинтересованы в реверсивной инженерии, это также сделает вас лучшим программистом OS X в целом.
-121--2901442- Нет машин, где размер (символ)
равен 4. Это всегда 1 байт. Этот байт может содержать 32 бита, но что касается компилятора Си, это один байт. Для получения более подробной информации, я на самом деле направлю вас на C++ FAQ 26,6 . Эта ссылка охватывает его довольно хорошо, и я довольно уверен, что C++ получил все эти правила от C. Вы также можете посмотреть на comp.lang.c FAQ 8,10 для символов больше 8 бит.
Upd2: Но размер результата НЕ является BYTES ! это размер CHAR. И char может 2 байт, или (может быть) 7 бит?
Да, это байты. Позволь мне сказать это еще раз. sizeof (char)
- 1 байт в соответствии с компилятором C. То, что люди в просторечии называют байтом (8 бит), не обязательно совпадает с тем, что компилятор Си называет байтом. Количество битов в байте C зависит от архитектуры компьютера. Также гарантированно будет не меньше 8.
PDP-10 и PDP-11 был.
Обновление: как ни один компилятор C99 для PDP-10.
Некоторые модели аналоговых устройств 32-битного SHARC DSP имеют CHAR_BIT=32, и DSP Texas Instruments от TMS32F28xx имеют CHAR_BIT=16, , как сообщается .
Обновление: Есть GCC 3.2 для PDP-10 с CHAR_BIT=9. (проверьте include/limits.h в этом архиве).