Есть ли машины, где 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 может быть 2 байта, или (может быть) 7 бит?

Update3: Ладно. Все машины имеют sizeof(char) == 1. Но какие машины есть!--7--> ?

3 ответов


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

при нанесении операнда введите char, unsigned char или signed char, (или его квалифицированная версия) результат 1.

Edit: не часть вашего вопроса, но для интереса от Harbison and Steele, 3rd ed. (pre c99) p. 148:

блок памяти принимается за объем памяти, занимаемой одним характер, размер объекта тип char поэтому 1.

Edit: в ответ на ваш обновленный вопрос уместен следующий вопрос и ответ от Harbison и Steele (ibid, Ex. 4 СН. 6):

допустимо ли иметь C реализация в каком типе char can представлять значения в диапазоне от -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 standard и Harbison и Steele.

Edit: на самом деле (это в ответ на ваш вопрос upd 2), Что касается c99 sizeof(char) is в байтах, из раздела 6.5.3.4 снова:

оператор sizeof дает размер (в байтах) его операнда

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

в ответ на ваше упоминание о возможности 7 бит char: это невозможно в c99. В соответствии с разделом 5.2.4.2.1 стандарт минимум в 8:

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

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

 **CHAR_BIT 8**

- минимальный значение для объекта типа со знаком char

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

- максимальное значение для объекта типа со знаком 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-bit SHARC DSP имеют CHAR_BIT=32, и Texas Instruments DSP от TMS32F28xx имеют CHAR_BIT=16,.

обновление: есть GCC 3.2 для PDP-10 С CHAR_BIT=9 (проверьте Включить / ограничения.ч в этом архиве).