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
chares 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
charpueda representar valores que van desde -2,147,483,648 hasta 2,147,483,647? Si es así, ¿cuál seríasizeof(char)en esa implementación? ¿Cuáles serían las gamas más pequeñas y más grandes de tipoint?
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 desizeof(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.