¿Hay máquinas, donde sizeof (char)! = 1, o al menos CHAR_BIT> 8?
Pregunta
¿Hay máquinas (o compiladores), donde sizeof(char) != 1
?
¿El estándar C99 dice que sizeof(char)
sobre la aplicación conformidad con el 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 hacer frente a bytes (lectura mínima es de 4 bytes, alineadas), pero sólo el 4-s de bytes (uint32_t
), puede compilador para definir esta máquina sizeof(char)
a 4 / strike> sizeof(char)
será 1, pero Char tendrá 32 bits (macros CHAR_BIT
)
Update2: Pero sizeof resultado no es una BYTES! es el tamaño de CHAR. Y la carbonilla puede ser de 2 bytes, o (puede ser) 7 bits?
Update3:
Okay. Todas las máquinas tienen sizeof(char) == 1
. Pero lo que las máquinas han CHAR_BIT > 8
?
Solución
Siempre es aquel en el C99, sección 6.5.3.4:
Cuando se aplica a un operando que tiene tipo char, unsigned char, o firmado char, (o una versión calificada del mismo) el resultado es 1.
Edit: no forma parte de su pregunta, sino por el interés de Harbison y Steele, 3ª ed. (C99 pre) p. 148:
Una unidad de almacenamiento se toma para ser la cantidad de almacenamiento ocupado por uno personaje; el tamaño de un objeto de por lo tanto, tipo
char
es 1.
Editar: En respuesta a su pregunta actualizada, la siguiente pregunta y respuesta de Harbison y Steele es relevante (ibid, Ex 4 de 6 Ch..):
¿Es permisible para tener una C implementación en la cual
char
tipo puede representar valores que van desde -2147483648 a través 2147483647? Si es así, ¿cuál seríasizeof(char)
en virtud de que la aplicación? lo haría ser los rangos mínimos y máximos del Tipoint
?
Respuesta (ibid, p 382.):
Se permite (si es un desperdicio) para una aplicación a utilizar 32 bits para representar tipo
char
. A pesar de la implementación, el valor desizeof(char)
es siempre 1.
Si bien esto no se refiere específicamente a un caso en el que, según los bytes son 8 bits y char
son 4 de los bytes (en realidad imposibles con la definición C99, véase más adelante), el hecho de que sizeof(char) = 1
siempre se desprende de la norma C99 y Harbison y Steele.
Edit: De hecho (esto es en respuesta a su pregunta UPD 2), por lo que el C99 es sizeof(char)
preocupados es en bytes, de la sección 6.5.3.4 de nuevo:
El operador sizeof produce el tamaño (En bytes) de su operando
así combinado con la cita anterior, bytes de 8 bits y char
como 4 de esos bytes es imposible:. Para c99 un byte es el 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 del mínimo es de 8:
Sus valores definido por la implementación son iguales o mayor [el énfasis es mío] en magnitud a los que se muestran, con el mismo signo.
- número de bits para 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 unsigned char
**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 utilizado 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
Otros consejos
No hay máquinas en las que es sizeof(char)
4. Siempre es de 1 byte. Ese byte puede contener 32 bits, pero en lo que se refiere al compilador de C, que es un byte. Para más detalles, de hecho voy a apuntar en la C ++ FAQ 26,6 . Que enlazan cubre bastante bien y estoy bastante seguro de C ++ tiene todas esas reglas de C. También puede mirar comp.lang.c FAQ 8,10 para los caracteres de más de 8 bits.
UPD2: Pero sizeof resultado no es una BYTES ! es el tamaño de CHAR. Y la carbonilla puede ser de 2 bytes, o (puede ser) 7 bit?
Sí, es bytes. Déjame decirlo otra vez. sizeof(char)
es 1 byte de acuerdo con el compilador C. Lo que la gente coloquialmente llaman un byte (8 bits) no es necesariamente el mismo que el compilador C llama un byte. El número de bits en un byte C varía dependiendo de la arquitectura de la máquina. También se garantiza que sea al menos 8.
PDP-10 y PDP-11 era.
Actualización: allí como no hay compiladores C99 para PDP-10
Algunos modelos de Analog Devices de 32 bits SHARC DSP tienen CHAR_BIT = 32, y Texas Instruments DSP de TMS32F28xx tiene CHAR_BIT = 16, rel="noreferrer"> .
Actualización: Hay GCC 3.2 para PDP-10 con CHAR_BIT = 9 (Verificación Incluir / limits.h en ese archivo).