2010-02-07 1 views
86

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

C99 стандарт говорит, что sizeof(char) по стандартным реализациям соответствия ДОЛЖНО быть ровно 1? Если да, пожалуйста, дайте мне номер раздела и цитату.

Обновление: Если у меня есть машина (CPU), который не может адресовать байты (минимальное чтение составляет 4 байта, выравнивается), но только в 4-х байтах (uint32_t), может компилятор для этого машина определить sizeof(char) до 4? sizeof(char) будет 1, но символ будет иметь 32 бита (CHAR_BIT макросы)

UPDATE2: Но SizeOf результат НЕ ЧИСЛО! это размер CHAR. И char может быть 2 байта, или (может быть) 7 бит?

Update3: Ok. Все машины имеют sizeof(char) == 1. Но какие машины имеют CHAR_BIT > 8?

+0

Что вас действительно беспокоит? Вам не нравится называть sizeof()? –

+4

Я обеспокоен стандартом C99. Я тесно сотрудничаю с компиляторами C99 – osgx

+2

Поскольку Unicode становится еще более важным, могут возникнуть нестандартные компиляторы, которые используют символы Unicode как 'char' (вместо' wchar'.) Даже если в стандарте указано, что 'sizeof (char)' must 1, я бы не стал полагаться на это предположение. –

ответ

86

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

При нанесении на операнд, который имеет символьный тип, без знака полукокса, или подписанных полукокса, (или квалифицированной ее разновидность) в результатом является 1.

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

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

Edit: В ответ на ваш обновленный вопрос, следующий вопрос и ответ от Харбисона и Стила актуальна (.. там же, Ex 4 гл 6) :

ли допустимо, чтобы иметь реализацию C , в котором тип char может представлять значения в диапазоне от -2147483648 через 2,147,483,647? Если да, то что будет sizeof(char) в рамках этой реализации? Что будет be самый маленький и самый большой расстояния тип 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 байт является такой же, как char.

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

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

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

**CHAR_BIT 8** 

- минимальное значение для объекта типа подписанного полукокса

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

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

**SCHAR_MAX +127//27−1** 

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

**UCHAR_MAX 255//28−1** 

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

**CHAR_MIN** see below 

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

**CHAR_MAX** see below 

[...]

Если значение объекта типа char рассматривается как подписанное целое число er, когда используется в выражении, значение CHAR_MIN должно быть таким же, как у SCHAR_MIN, а значение CHAR_MAX должно быть таким же, как значение SCHAR_MAX. В противном случае значение CHAR_MIN должно быть 0, а значение CHAR_MAX должно быть таким же, как и у UCHAR_MAX. Значение UCHAR_MAX должно равняться 2^CHAR_BIT - 1.

+9

Замечание: есть макрос CHAR_BITS, который расскажет вам, сколько бит ваших символов. – nos

+1

Полные данные этой замечательной книги * Harbison и Steele's C: Справочное руководство, Третье издание, Prentice Hall, 1991 * – osgx

+0

Да, спасибо за то, что вы заложили название, это Harbison и Steele, которые я цитирую выше (обратите внимание, что он не распространяется c99). – Ramashalanka

16

Там нет машин, где sizeof(char) равно 4. Это всегда 1 байт.Этот байт может содержать 32 бита, но, что касается компилятора C, это один байт. Для получения более подробной информации я собираюсь указать вам на C++ FAQ 26.6. Эта ссылка очень хорошо его охватывает, и я уверен, что C++ получил все эти правила из C. Вы также можете посмотреть comp.lang.c FAQ 8.10 для символов размером более 8 бит.

UPD2: Но SizeOf результат НЕ БАЙТ ! это размер CHAR. И char может быть 2 байтами, или (может быть) 7 бит?

Да, это байты. Позвольте мне повторить это. sizeof(char) - 1 байт в соответствии с компилятором C. То, что люди разговорно называют байтом (8 бит), не обязательно совпадает с тем, что компилятор C вызывает байтом. Количество бит в байтах C зависит от архитектуры вашего компьютера. Гарантируется также не менее 8.

+2

Пожалуйста !!! C++ - это действительно РАЗЛИЧНЫЙ язык из C (C99). Этот вопрос касается только простой C. – osgx

+0

Что делать, если машина/ЦП не могут получить доступ к 8-битным байтам? Несвязанный доступ запрещен. (Даже на x86 malloc возвращает выровненные данные и выделяет память в умножении на 4 байта.) Тогда CHAT_BIT будет больше 8. Да, такая платформа может быть довольно особенной. osgx

+9

@osgx, я склонен кричать так же, как вы только что делали, когда люди пытались смешивать C и C++. Но я думаю ** в этом случае **, что одна запись в C++ часто применяется одинаково хорошо для C. –

8

PDP-10 и PDP-11 был.

Обновление: там, как нет компиляторов C99 для PDP-10.

Некоторые модели Analog Devices 32-битный DSP SHARC имеет CHAR_BIT = 32, и Texas Instruments DSP от TMS32F28xx имеет CHAR_BIT = 16, reportedly.

Обновление: есть GCC 3.2 for PDP-10 с CHAR_BIT = 9 (отметьте include/limits.h в этом архиве).

+1

Не путайте реализации языков с похожими, но не-C C. Вы даже сказали: «Я обеспокоен стандартным соблюдением C99. Я тесно сотрудничаю с компиляторами C99». – 2010-02-07 04:01:25

+1

@Roger: Нечестно назвать GCC3 не совместимым с C99, если вы не имеете дело с крайними крайними случаями, которые считаются ошибками в GCC. – Joshua

+1

@ Joshua, я думаю, что Роджер говорит о K & R и pcc исторических компиляторах. Также нечестно утверждать, что он совместим с C99, прежде чем C99-совместимость testuite запущена на PDP-10, когда скомпилирована с этим портом (могут быть ошибки от портирования и от самой машины). Но можно ожидать, что он будет близок к стандарту C99, как и GCC3.2 на x86. – osgx

Смежные вопросы