Существуют ли машины, где sizeof(char) != 1 или хотя бы CHAR_BIT > 8?

StackOverflow https://stackoverflow.com/questions/2215445

Вопрос

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

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

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

Обновление 2: Но размер результата - ЭТО НЕ БАЙТ !это размер символа.А char может быть 2 байта или (может быть) 7 бит?

Обновление 3: ОК.Все машины имеют sizeof(char) == 1.Но какие машины имеют CHAR_BIT > 8 ?

Это было полезно?

Решение

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

При применении к операнду, имеющему тип char, unsigned char или signed char (или его расширенную версию) результат равен 1.

Редактировать:это не часть вашего вопроса, но для интереса со стороны Харбисона и Стила, 3-е изд.(до c99) стр.148:

За единицу памяти принимается объем памяти, занимаемый одним символом;площадь объекта тип char следовательно, равно 1.

Редактировать:В ответ на ваш обновленный вопрос уместны следующие вопрос и ответ от Харбисона и Стила (ibid, 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 и Harbison and Steele.

Редактировать:На самом деле (это в ответ на ваш вопрос 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**

— минимальное значение для объекта типа 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 ++ 26.6.Эта ссылка довольно хорошо описывает это, и я совершенно уверен, что C ++ получил все эти правила от C.Вы также можете посмотреть на часто задаваемые вопросы по comp.lang.c 8.10 для символов размером более 8 бит.

Обновление 2:Но размер результата - ЭТО НЕ БАЙТ !это размер символа.И char может быть 2 байта или (может быть) 7 бит?

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

PDP-10 и PDP-11 был.

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

Некоторые модели 32-разрядных устройств Analog Devices с SHARC DSP имеют CHAR_BIT=32, а DSP Texas Instruments от TMS32F28xx имеют CHAR_BIT=16, по имеющимся сведениям.

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top