¿Hay máquinas (o compiladores), dónde sizeof(char) != 1
?
¿El estándar C99 dice que la sizeof(char)
implementación del cumplimiento del estándar DEBE ser exactamente 1? Si es así, por favor, deme el número de sección y la cita.
Actualización:
si tengo una máquina (CPU), que no puede direccionar bytes (la lectura mínima es 4 bytes, alineados), pero solo 4-s de bytes ( uint32_t
), ¿ puede el compilador para esta máquina definir sizeof(char)
en 4? sizeof(char)
será 1, pero char tendrá 32 bits ( CHAR_BIT
macros)
Actualización 2: ¡ Pero el tamaño del resultado NO es un BYTES! es del tamaño de CHAR. ¿Y char puede ser de 2 bytes o (puede ser) de 7 bits?
Update3:
Ok. Todas las máquinas tienen sizeof(char) == 1
. Pero, ¿qué máquinas tienen CHAR_BIT > 8
?
char
(en lugar dewchar
). Incluso si el estándar dice quesizeof(char)
debe ser 1, no confiaría en esa suposición.sizeof(char)
es siempre 1, incluso si char es de 32 bits (como sucede en algunos sistemas). C tiene muchas verrugas divertidas.sizeof(char) == sizeof(short) && sizeof(char) == sizeof(int)
en esas; no recuerdosizeof(int) == sizeof(long)
si CHAR_BIT era 32 o 64; supongo que era 32, y creo quesizeof(long) == 1
también. (Puede encontrar una referencia, pero no acceso en línea a, un manual de Cray C ).Respuestas:
Siempre es uno en C99, sección 6.5.3.4:
Editar: no es parte de su pregunta, pero sí el interés de Harbison y Steele, 3ª ed. (pre c99) pág. 148:
Editar: En respuesta a su pregunta actualizada, la siguiente pregunta y respuesta de Harbison y Steele es relevante (ibid, Ex.4 del Cap.6):
Respuesta (ibid, p. 382):
Si bien esto no aborda específicamente un caso en el que, digamos, los bytes son 8 bits y
char
son 4 de esos bytes (realmente imposible con la definición de c99, ver más abajo), el hecho de quesizeof(char) = 1
siempre queda claro en el estándar c99 y Harbison y Steele.Editar: De hecho (esto es en respuesta a su pregunta upd 2), en lo que respecta a c99
sizeof(char)
está en bytes, de la sección 6.5.3.4 nuevamente: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 achar
.En respuesta a su mención de la posibilidad de un 7 bit
char
: esto no es posible en c99. Según el apartado 5.2.4.2.1 de la norma el mínimo es 8:Sus valores definidos por la implementación serán iguales o mayores [énfasis mío] 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)
- valor mínimo para un objeto de tipo char firmado
- valor máximo para un objeto de tipo carácter firmado
- valor máximo para un objeto de tipo unsigned char
- valor mínimo para un objeto de tipo char
- valor máximo para un objeto de tipo char
[...]
fuente
sizeof(char)
: es otro elemento para debatir / verificar / etc. en sus convenciones / estándares / pautas de codificación, pierdo el tiempo preguntándome si realmente conoce C y qué más puede ser incorrecto, ocupa el "ancho de banda" visual / mental / de línea de texto.No hay máquinas donde
sizeof(char)
es 4. Siempre es 1 byte. Ese byte puede contener 32 bits, pero en lo que respecta al compilador de C, es un byte. Para obtener más detalles, voy a señalarle la pregunta frecuente 26.6 de C ++ . 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.Sí, son bytes. Déjame decirlo otra vez.
sizeof(char)
es de 1 byte según el compilador de C. Lo que la gente llama coloquialmente 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.fuente
PDP-10
y PDP-11fue.Actualización:
no hay compiladores C99 para PDP-10.Algunos modelos de DSP SHARC de 32 bits de Analog Devices tienen CHAR_BIT = 32, y el DSP de Texas Instruments de TMS32F28xx tiene CHAR_BIT = 16, según se informa .
Actualización: hay GCC 3.2 para PDP-10 con CHAR_BIT = 9 (verifique include / limits.h en ese archivo).
fuente