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í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.