¿Cuál es la diferencia entre "long", "long long", "long int" y "long long int" en C++?
Estoy haciendo la transición de Java a C++ y tengo algunas preguntas sobre el long
tipo 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 long
es 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?
long
y long int
son identicos. También lo son long long
y long long int
. En ambos casos, el int
es opcional.
En cuanto a la diferencia entre los dos conjuntos, el estándar C++ exige rangos mínimos para cada uno, y eso long long
es 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 types
secció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 int
opcional), 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 int
tipo. Lo mismo ocurre con long long
ser un especificador del long long int
tipo.
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 double
y proporcionar un superconjunto de valores sobre ese tipo (es decir, al menos esos valores, no necesariamente más valores).
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.