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 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?

¿Fue útil?

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ía sizeof(char)   en virtud de que la aplicación? lo haría   ser los rangos mínimos y máximos del   Tipo int?

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 de   sizeof(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).

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top