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

Есть ли машины (или компиляторы), где 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 ?

90
задан Deduplicator 27 December 2015 в 21:23
поделиться

3 ответа

Это всегда единица в 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.

89
ответ дан 24 November 2019 в 07:06
поделиться

Я думаю, что это должно сделать трюк:

preg _ match ('/^ [a-zA-Z0-9] {4,30} $/', $ psword);

-121--2938619-

Вы должны захватить копию 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.

20
ответ дан 24 November 2019 в 07:06
поделиться

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 в этом архиве).

9
ответ дан 24 November 2019 в 07:06
поделиться
Другие вопросы по тегам:

Похожие вопросы: