long - short c++ para que sirve
¿Cuál es la diferencia entre "long", "long long", "long int" y "long long int" en C++? (5)
Esto parece confuso porque está tomando long
como un tipo de datos en sí mismo.
long
no es más que la abreviatura de long int
cuando lo está usando solo.
long
es un modificador, puede usarlo también con double
long double
.
long
== long int
.
Ambos toman 4 bytes.
Estoy en transición de Java a C ++ y tengo algunas preguntas sobre el tipo de datos long
. En Java, para contener un número entero mayor que 2 32 , simplemente escribiría long x;
. Sin embargo, en C ++, parece que tanto long
es un tipo de datos y un modificador.
Parece haber varias formas de usar long
:
long x;
long long x;
long int x;
long long int x;
Además, parece que hay cosas como:
long double x;
y así.
¿Cuál es la diferencia entre todos estos diversos tipos de datos, y todos tienen el mismo propósito?
Históricamente, en los primeros tiempos C, cuando los procesadores tenían una longitud de palabra de 8 o 16 bits, int
era idéntico al short
hoy (16 bits). En cierto sentido, int es un tipo de datos más abstracto que char
, short
, long
o long long
, ya que no puede estar seguro del ancho de bit.
Cuando se define int n;
podrías traducir esto con "dame el mejor compromiso de ancho de bit y velocidad en esta máquina para n". Quizás en el futuro espere que los compiladores traduzcan int
para ser de 64 bits. Por lo tanto, cuando desee que su variable tenga 32 bits y no más, mejor use una long
explícita como tipo de datos.
[Editar: #include <stdint.h>
parece ser la forma correcta de asegurar los anchos de bits usando los tipos int ## _ t, aunque todavía no es parte del estándar.]
Long y long int son al menos 32 bits.
long long y long long int son al menos 64 bits. Debe usar un compilador c99 o mejor.
los dobles largos son un poco extraños. Búsquelos en Wikipedia para más detalles.
long
es equivalente a long int
, tan short
es equivalente a short int
. Un long int
es un tipo integral con signo que tiene al menos 32 bits, mientras que un long long int
long long
o long long int
es un tipo integral con signo que tiene al menos 64 bits.
Esto no significa necesariamente que un long long
es más ancho que un long
. Muchas plataformas / ABI usan el modelo LP64
, donde long
(y punteros) tienen 64 bits de ancho. Win64 usa el LLP64
, donde el long
es todavía de 32 bits, y el de long long
(y los punteros) son de 64 bits de ancho.
Aquí hay un buen resumen de los modelos de datos de 64 bits.
long double
no garantiza mucho más de lo que será al menos tan ancho como un double
.
long
y long int
son idénticos. Por lo tanto, 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 intervalos mínimos para cada uno, y ese long long
es al menos tan long
como long
.
Las partes que controlan el estándar (C ++ 11, pero esto ha existido durante mucho tiempo) son, para uno, 3.9.1 Fundamental types
, sección 2 (una sección posterior proporciona reglas similares para los tipos integrales sin firmar):
Hay cinco tipos de entero con signo estándar: char firmado, int corto, int, int largo y int largo largo. En esta lista, cada tipo proporciona al menos tanto almacenamiento como los que lo 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 los tipos reales (lo que demuestra que int
es 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 cómo le dice al compilador de qué tipo es, pero puede usar diferentes especificadores para terminar en el mismo tipo.
Por long
tanto, long
por sí solo no es un tipo ni un modificador como lo plantea su pregunta, es simplemente un especificador para el tipo long int
. Ídem por long long
es un especificador para el tipo long long int
.
Aunque el estándar C ++ en sí no especifica los rangos mínimos de tipos integrales, cita C99, en 1.2 Normative references
, como aplicable. Por lo tanto, los rangos mínimos que se establecen en C99 5.2.4.2.1 Sizes of integer types <limits.h>
son aplicables.
En términos de long double
, en realidad es un valor de coma flotante en lugar de un número entero. De forma similar a los tipos integrales, se requiere tener al menos tanta precisión como un double
y proporcionar un superconjunto de valores sobre ese tipo (es decir, al menos esos valores, no necesariamente más valores).