¿Cuál es la diferencia entre "long", "long long", "long int" y "long long int" en C++?

Resuelto 1110101001 asked hace 11 años • 7 respuestas

Estoy haciendo la transición de Java a C++ y tengo algunas preguntas sobre el longtipo de datos. En Java, para contener un número entero mayor que 2 32 , simplemente escribirías long x;. Sin embargo, en C++, parece que longes tanto un tipo de datos como un modificador.

Parece haber varias formas de utilizarlo long:

long x;
long long x;
long int x;
long long int x;

Además, parece que hay cosas como:

long double x;

etcétera.

¿Cuál es la diferencia entre todos estos distintos tipos de datos? ¿Tienen todos el mismo propósito?

1110101001 avatar Sep 24 '13 08:09 1110101001
Aceptado

longy long intson identicos. También lo son long longy long long int. En ambos casos, el intes opcional.

En cuanto a la diferencia entre los dos conjuntos, el estándar C++ exige rangos mínimos para cada uno, y eso long longes al menos tan amplio como long.

Las partes de control del estándar (C++11, pero esto existe desde hace mucho tiempo) son, por un lado, la 3.9.1 Fundamental typessección 2 (una sección posterior proporciona reglas similares para los tipos integrales sin signo):

Hay cinco tipos estándar de enteros con signo: char con signo, short int, int, long int y long long int. En esta lista, cada tipo proporciona al menos tanto almacenamiento como los que le preceden en la lista.

También hay una tabla 9 en 7.1.6.2 Simple type specifiers, que muestra las "asignaciones" de los especificadores a tipos reales (que muestra que es intopcional), una sección de la cual se muestra a continuación:

Specifier(s)         Type
-------------    -------------
long long int    long long int
long long        long long int
long int         long int
long             long int

Tenga en cuenta la distinción entre el especificador y el tipo. El especificador es la forma en que le dice al compilador cuál es el tipo, pero puede usar diferentes especificadores para terminar en el mismo tipo.

Por lo tanto long, por sí solo no es un tipo ni un modificador como plantea su pregunta, es simplemente un especificador del long inttipo. Lo mismo ocurre con long longser un especificador del long long inttipo.

Aunque el estándar C++ en sí no especifica los rangos mínimos de tipos integrales, sí cita C99, en 1.2 Normative references, como aplicable. Por lo tanto, son aplicables los rangos mínimos establecidos en C99 5.2.4.2.1 Sizes of integer types <limits.h>.


En términos de long double, en realidad es un valor de punto flotante en lugar de un número entero. De manera similar a los tipos integrales, se requiere tener al menos tanta precisión como a doubley proporcionar un superconjunto de valores sobre ese tipo (es decir, al menos esos valores, no necesariamente más valores).

paxdiablo avatar Sep 24 '2013 01:09 paxdiablo

Long y long int tienen al menos 32 bits.

long long y long long int tienen al menos 64 bits. Debes estar usando un compilador c99 o mejor.

Los dobles largos son un poco extraños. Búscalos en Wikipedia para más detalles.

Eric Lippert avatar Sep 24 '2013 01:09 Eric Lippert