¿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_BITmacros)
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) == 1tambié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
charson 4 de esos bytes (realmente imposible con la definición de c99, ver más abajo), el hecho de quesizeof(char) = 1siempre 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
charcomo 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