¿Está garantizado que el char sea exactamente de 8 bits de largo?

Eso es todo. No encontré ningún tema similar, así que tengan paciencia conmigo.

De una copia de la especificación ANSI C , vea la Sección 3.1.2.5 – Tipos :

Un objeto declarado como tipo char es lo suficientemente grande como para almacenar cualquier miembro del conjunto de caracteres de ejecución básico. Si un miembro del juego de caracteres fuente requerido enumerado en $ 2.2.1 se almacena en un objeto char, se garantiza que su valor será positivo. Si se almacenan otras cantidades en un objeto char, el comportamiento está definido por la implementación: los valores se tratan como enteros firmados o no negativos.

El concepto de “juego de caracteres de ejecución” se presenta en la Sección 2.2.1 – Conjuntos de caracteres .

En otras palabras, un char debe ser al menos lo suficientemente grande como para contener una encoding de al menos los 95 caracteres diferentes que componen el conjunto de caracteres de ejecución básico.

Ahora agregue a eso la sección 2.2.4.2 – Límites numéricos

Una implementación conforme deberá documentar todos los límites especificados en esta sección, que se especificarán en los encabezados y .

Tamaños de tipos integrales

Los valores que figuran a continuación se sustituirán por expresiones constantes adecuadas para su uso en las directivas #if de preprocesamiento. Sus valores definidos por la implementación serán iguales o mayores en magnitud (valor absoluto) que los mostrados, con el mismo signo.

  • número máximo 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

  • valor máximo para un objeto de tipo char firmado
    SCHAR_MAX +127

  • valor máximo para un objeto de tipo char sin signo
    UCHAR_MAX 255

….

Así que ahí lo tienen: el número de bits en un char debe ser de al menos 8.

No, no se garantiza que sea de 8 bits. sizeof (char) se garantiza que es 1, pero eso no significa necesariamente un byte de 8 bits.

no, el tipo de datos char debe contener al menos 8 bits (ver especificación ANSI C)

El borrador estándar C99 dice que un byte debe tener al menos 8 bits de ancho, porque contiene una macro CHAR_BIT que produce el número de bits por byte, y se garantiza que será al menos 8 (§5.2.4.2. 1).

El borrador estándar de C ++ incluye C bajo el nombre (§18.2.2).

Veamos exactamente lo que dice el estándar:

5.2.4.2.1 Tamaños de tipos enteros

Sus valores definidos por la implementación serán iguales o mayores en magnitud (valor absoluto) 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

Esto nos dice que un byte tiene al menos 8 bits (el párrafo está justo debajo)

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


Para cada uno de los tipos de entero con signo, existe un tipo de entero sin signo correspondiente (pero diferente) (designado con la palabra clave sin signo) que utiliza la misma cantidad de almacenamiento (incluida la información de signo) y tiene los mismos requisitos de alineación.


Para los tipos enteros sin signo que no sean char sin signo, los bits de la representación del objeto se dividirán en dos grupos: bits de valor y bits de relleno (no es necesario que exista ninguno de estos últimos).

Estos pasajes nos dicen que:

  • un carácter sin signo necesita representar 2 ^ valores CHAR_BIT-1, que pueden codificarse en bits CHAR_BIT mínimos (de acuerdo con la representación de bits convencional, que está prescrita por el estándar)
  • un char sin signo no contiene ningún bit adicional (relleno)
  • un char firmado toma exactamente el mismo espacio que un char sin signo
  • un char se implementa de la misma manera que como char firmado o sin signo

Conclusión: un char y sus variantes sin signo char y firmado con signo tienen la garantía de ser exactamente un byte en tamaño, y un byte se garantiza que sea de al menos 8 bits de ancho.

Ahora son otras indicaciones (pero no una prueba formal como la anterior) de que un char es de hecho un byte:

A excepción de los campos de bits, los objetos se componen de secuencias contiguas de uno o más bytes, cuyo número, orden y encoding se especifican explícitamente o están definidos por la implementación.


Los valores almacenados en objetos de campo no bit de cualquier otro tipo de objeto consisten en n × bits CHAR_BIT, donde n es el tamaño de un objeto de ese tipo, en bytes. El valor puede copiarse en un objeto de tipo unsigned char [n]


El operador sizeof produce el tamaño (en bytes) de su operando, que puede ser una expresión o el nombre entre paréntesis de un tipo. El tamaño se determina a partir del tipo de operando. El resultado es un entero. Si el tipo del operando es un tipo de matriz de longitud variable, se evalúa el operando; de lo contrario, el operando no se evalúa y el resultado es una constante entera.


Cuando se aplica a un operando que tiene tipo char, unsigned char, o signed char, (o una versión calificada del mismo) el resultado es 1. Cuando se aplica a un operando que tiene tipo de matriz, el resultado es el número total de bytes en la matriz . 88) Cuando se aplica a un operando que tiene una estructura o tipo de unión, el resultado es el número total de bytes en dicho objeto, incluidos el relleno interno y final.

(Tenga en cuenta que hay una ambigüedad aquí. ¿El tamaño de (char) aquí anula la regla de tamaño de (tipo) o simplemente da un ejemplo?

Aún así, queda un problema por abordar. ¿Qué es exactamente un byte? Según el estándar, es “el objeto más pequeño que no es un campo de bits”. Tenga en cuenta que esto teóricamente puede no corresponderse con un byte de la máquina , y que también existe ambigüedad en cuanto a lo que se conoce como “byte de la máquina”: podría hacer lo que los constructores denominen “byte”, sabiendo que cada constructor puede tener una definición de “byte”; o una definición general como “una secuencia de bits que una computadora procesa en unidades individuales” o “el fragmento más pequeño de datos direccionables”.

Por ejemplo, una máquina que tiene bytes de 7 bits, tendría que implementar un “byte C” como dos bytes de máquina.

Fuente de todas las citas: Borrador del Comité – 7 de septiembre de 2007 ISO / IEC 9899: TC3 .

Del estándar C que describe los límites.h (se requiere reformateo):

  1. número de bits para el objeto más pequeño que no es un campo de bits (byte): CHAR_BIT 8
  2. valor mínimo para un objeto de tipo char firmado: SCHAR_MIN -127
  3. valor máximo para un objeto de tipo char firmado: SCHAR_MAX +127

CHAR_BIT mínimo de 8 asegura que un personaje tenga al menos 8 bits de ancho. Los rangos en SCHAR_MIN y SCHAR_MAX aseguran que la representación de un char firmado utiliza al menos ocho bits.

Lo primero que diría es que si necesita un tipo para ser un número exacto de bits, utilice un tipo específico de tamaño. Dependiendo de su plataforma, puede variar de __s8 para un tipo de 8 bits firmado en Linux a __int8 en VC ++ en Windows.

Ahora, de acuerdo con Robert Love en su capítulo sobre portabilidad en “Linux Kernel Development”, afirma que el estándar C “deja el tamaño de los tipos estándar hasta las implementaciones, aunque sí dicta un tamaño mínimo”.

Luego, en una nota al pie de la página, dice: “Con la excepción de char que siempre es de 8 bits”.

Ahora no estoy seguro de en qué se basa esto, pero tal vez sea esta sección de la especificación ANSI C ?

2.2.4.2 Límites numéricos

Una implementación conforme deberá documentar todos los límites especificados en esta sección, que se especificarán en los límites de encabezados.h y float.h

“Tamaños de tipos integrales limits.h”

Los valores que figuran a continuación se sustituirán por expresiones constantes adecuadas para su uso en las directivas #if de preprocesamiento. Sus valores definidos por la implementación serán iguales o mayores en magnitud (valor absoluto) que los mostrados, con el mismo signo.

número máximo 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

valor máximo para un objeto de tipo char firmado

SCHAR_MAX +127

valor máximo para un objeto de tipo char sin signo

UCHAR_MAX 255

valor mínimo para un objeto de tipo char

CHAR_MIN ver abajo

valor máximo para un objeto de tipo char

CHAR_MAX ver abajo

número máximo de bytes en un carácter multibyte, para cualquier configuración regional admitida

MB_LEN_MAX 1

valor mínimo para un objeto de tipo short int

SHRT_MIN -32767

valor máximo para un objeto de tipo short int

SHRT_MAX +32767

valor máximo para un objeto de tipo unsigned short int

USHRT_MAX 65535

valor mínimo para un objeto de tipo int

INT_MIN -32767

valor máximo para un objeto de tipo int

INT_MAX +32767

valor máximo para un objeto de tipo unsigned int

UINT_MAX 65535

valor mínimo para un objeto de tipo long int

LONG_MIN -2147483647

valor máximo para un objeto de tipo int largo

LONG_MAX +2147483647

valor máximo para un objeto de tipo unsigned long int

ULONG_MAX 4294967295

Si el valor de un objeto de tipo char sign-extends 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. Si el valor de un objeto de tipo char no se extiende-señaliza cuando se utiliza en una expresión, el valor de CHAR_MIN será 0 y el valor de CHAR_MAX será el mismo que el de UCHAR_MAX ./7/