long array c char standards sizeof c99

array - ¿Hay máquinas, donde sizeof(char)!=1, o al menos CHAR_BIT> 8?



sizeof php (3)

¿Hay máquinas (o compiladores), donde sizeof(char) != 1 ?

¿El estándar C99 dice que sizeof(char) en la implementación de cumplimiento estándar DEBE ser exactamente 1? Si lo hace, por favor, dame el número de sección y la cita.

Actualización: si tengo una máquina (CPU) que no puede direccionar los bytes (la lectura mínima es de 4 bytes, alineada), pero solo 4 s de bytes ( uint32_t ), el compilador de esta máquina puede definir sizeof(char) a 4 ? sizeof(char) será 1, pero char tendrá 32 bits (macros CHAR_BIT )

Actualización2: ¡ Pero el resultado del sizeof NO es un BYTES! es del tamaño de CHAR. ¿Y el char puede ser de 2 bytes o (puede ser) de 7 bits?

Actualización3: Ok. Todas las máquinas tienen sizeof(char) == 1 . Pero, ¿qué máquinas tienen CHAR_BIT > 8 ?


No hay máquinas donde sizeof(char) es 4. Siempre es de 1 byte. Ese byte puede contener 32 bits, pero en lo que se refiere al compilador de C, es un byte. Para más detalles, en realidad voy a señalarte en C ++ FAQ 26.6 . Ese enlace lo cubre bastante bien y estoy bastante seguro de que C ++ obtuvo todas esas reglas de C. También puede consultar comp.lang.c FAQ 8.10 para caracteres de más de 8 bits.

Upd2: ¡Pero el resultado del sizeof NO es BYTES! es del tamaño de CHAR. ¿Y el char puede ser de 2 bytes o (puede ser) de 7 bits?

Sí, es bytes. Déjame decirlo otra vez. sizeof(char) es de 1 byte según el compilador de C. Lo que las personas coloquialmente llaman un byte (8 bits) no es necesariamente lo mismo que lo que el compilador de C llama un byte. La cantidad de bits en un byte C varía según la arquitectura de su máquina. También se garantiza que sea al menos 8.


PDP-10 y PDP-11 fue.

Actualización: no hay compiladores C99 para PDP-10.

Algunos modelos de Analog Devices SHARC DSP de 32 bits tienen CHAR_BIT = 32, y Texas Instruments DSP de TMS32F28xx tienen CHAR_BIT = 16, reportedly .

Actualización: Hay GCC 3.2 para PDP-10 con CHAR_BIT = 9 (compruebe include / limits.h en ese archivo).


Siempre es uno en C99, sección 6.5.3.4:

Cuando se aplica a un operando que tiene tipo char, char sin signo o char firmado, (o una versión calificada del mismo) el resultado es 1.

Editar: no es parte de su pregunta, pero para el interés de Harbison y Steele, 3ª ed. (pre c99) p. 148:

Una unidad de almacenamiento se toma como la cantidad de almacenamiento ocupada por un personaje; el tamaño de un objeto de tipo char es por lo tanto 1.

Editar: en respuesta a su pregunta actualizada, la siguiente pregunta y respuesta de Harbison y Steele es relevante (ibid, Ex. 4 de Ch. 6):

¿Es permisible tener una implementación C en la que el tipo char pueda representar valores que van desde -2,147,483,648 hasta 2,147,483,647? Si es así, ¿cuál sería sizeof(char) en esa implementación? ¿Cuáles serían las gamas más pequeñas y más grandes de tipo int ?

Respuesta (ibid, p 382):

Está permitido (si es derrochador) que una implementación use 32 bits para representar el tipo char . Independientemente de la implementación, el valor de sizeof(char) siempre es 1.

Si bien esto no aborda específicamente un caso donde, por ejemplo, los bytes son 8 bits y char son 4 de esos bytes (en realidad imposible con la definición c99, ver más abajo), el sizeof(char) = 1 siempre es claro desde el estándar c99 y Harbison y Steele.

Editar: De hecho (esto es en respuesta a su pregunta upd 2), en lo que se refiere a c99 sizeof(char) está en bytes, de la sección 6.5.3.4 nuevamente:

El operador sizeof produce el tamaño (en bytes) de su operando

así que combinado con la cita anterior, bytes de 8 bits y char como 4 de esos bytes es imposible: para c99 un byte es lo mismo que un char .

En respuesta a su mención de la posibilidad de un char 7 bits: esto no es posible en c99. De acuerdo con la sección 5.2.4.2.1 de la norma, el mínimo es 8:

Sus valores definidos en la implementación serán iguales o mayores [mi énfasis] en magnitud a los mostrados, con el mismo signo.

- número de bits para el objeto más pequeño que no es un campo de bits (byte)

**CHAR_BIT 8**

- valor mínimo para un objeto de tipo char firmado

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

- valor máximo para un objeto de tipo char firmado

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

- valor máximo para un objeto de tipo char sin signo

**UCHAR_MAX 255//28−1**

- valor mínimo para un objeto de tipo char

**CHAR_MIN** see below

- valor máximo para un objeto de tipo char

**CHAR_MAX** see below

[...]

Si el valor de un objeto de tipo char se trata como un entero con signo cuando se usa en una expresión, el valor de CHAR_MIN será el mismo que el de SCHAR_MIN y el valor de CHAR_MAX será el mismo que el de SCHAR_MAX. De lo contrario, el valor de CHAR_MIN será 0 y el valor de CHAR_MAX será el mismo que el de UCHAR_MAX. El valor UCHAR_MAX será igual a 2 ^ CHAR_BIT - 1.