¿Cuál establece el estándar C++ que debe ser el tamaño de tipo int, long?

Resuelto Jérôme asked hace 15 años • 0 respuestas

Estoy buscando información detallada sobre el tamaño de los tipos básicos de C++. Sé que depende de la arquitectura (16 bits, 32 bits, 64 bits) y del compilador.

¿Pero existen estándares para C++?

Estoy usando Visual Studio 2008 en una arquitectura de 32 bits. Esto es lo que obtengo:

char  : 1 byte
short : 2 bytes
int   : 4 bytes
long  : 4 bytes
float : 4 bytes
double: 8 bytes

Intenté encontrar, sin mucho éxito, información confiable que indicara los tamaños de char, short, int, long, double( floaty otros tipos en los que no pensé) bajo diferentes arquitecturas y compiladores.

Jérôme avatar Feb 26 '09 14:02 Jérôme
Aceptado

El estándar C++ no especifica el tamaño de los tipos integrales en bytes, pero especifica rangos mínimos que deben poder contener. Puede inferir el tamaño mínimo en bits del rango requerido. Puede inferir el tamaño mínimo en bytes a partir de eso y del valor de la CHAR_BITmacro que define el número de bits en un byte . En todas las plataformas, excepto en las más oscuras, es 8, y no puede ser menos de 8.

Una restricción adicional chares que su tamaño es siempre de 1 byte o CHAR_BITbits (de ahí el nombre). Esto está establecido explícitamente en la norma.

El estándar C es una referencia normativa para el estándar C++, por lo que, aunque no establece estos requisitos explícitamente, C++ requiere los rangos mínimos requeridos por el estándar C (página 22), que son los mismos que los de Rangos de tipos de datos en MSDN :

  1. signed char: -127 a 127 (nota, no -128 a 127; esto se adapta a plataformas en complemento a 1 y de signo y magnitud)
  2. unsigned char: 0 a 255
  3. "simple" char: mismo rango que signed charo unsigned char, definido por la implementación
  4. signed short: -32767 a 32767
  5. unsigned short: 0 a 65535
  6. signed int: -32767 a 32767
  7. unsigned int: 0 a 65535
  8. signed long: -2147483647 al 2147483647
  9. unsigned long: 0 al 4294967295
  10. signed long long: -9223372036854775807 a 9223372036854775807
  11. unsigned long long: 0 a 18446744073709551615

Una implementación de C++ (o C) puede definir el tamaño de un tipo en bytes sizeof(type)a cualquier valor, siempre que

  1. la expresión sizeof(type) * CHAR_BITse evalúa como un número de bits lo suficientemente alto como para contener los rangos requeridos, y
  2. el orden de tipo sigue siendo válido (p. ej. sizeof(int) <= sizeof(long)).

Si sumamos todo esto, tenemos la garantía de que:

  • char, signed char, y unsigned charson de al menos 8 bits
  • signed short, unsigned short, signed int, y unsigned intson de al menos 16 bits
  • signed longy unsigned longson de al menos 32 bits
  • signed long longy unsigned long longson de al menos 64 bits

No se ofrece ninguna garantía sobre el tamaño de floato doubleexcepto que doubleproporcione al menos tanta precisión como float.

Los rangos reales específicos de la implementación se pueden encontrar en <limits.h>el encabezado en C o <climits>en C++ (o incluso mejor, con plantilla std::numeric_limitsen <limits>el encabezado).

Por ejemplo, así es como encontrará el alcance máximo para int:

C:

#include <limits.h>
const int min_int = INT_MIN;
const int max_int = INT_MAX;

C++ :

#include <limits>
const int min_int = std::numeric_limits<int>::min();
const int max_int = std::numeric_limits<int>::max();
Alex B avatar Feb 26 '2009 08:02 Alex B

Para sistemas de 32 bits, el estándar 'de facto' es ILP32, es decir, inty longel puntero son todas cantidades de 32 bits.

Para los sistemas de 64 bits, el principal estándar "de facto" de Unix es LP64, longy el puntero es de 64 bits (pero intes de 32 bits). El estándar de Windows de 64 bits es LLP64 long longy el puntero es de 64 bits (pero longambos intson de 32 bits).

Hubo un tiempo en que algunos sistemas Unix utilizaban una organización ILP64.

Ninguna de estas normas de facto está regulada por la norma C (ISO/IEC 9899:1999), pero todas están permitidas por ella.

Y, por definición, sizeof(char)lo es 1, a pesar de la prueba en el script de configuración de Perl.

Tenga en cuenta que había máquinas (Crays) donde CHAR_BITera mucho más grande que 8. Eso significaba, IIRC, que sizeof(int)también era 1, porque ambos chary interan de 32 bits.

Jonathan Leffler avatar Feb 26 '2009 08:02 Jonathan Leffler