Estoy haciendo la transición de Java a C ++ y tengo algunas preguntas sobre el long
tipo de datos. En Java, para mantener un número entero mayor que 2 32 , simplemente escribiría long x;
. Sin embargo, en C ++, parece que long
es tanto un tipo de datos como un modificador.
Parece que hay 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?
c++
long-integer
1110101001
fuente
fuente
long long
podría ser más lento quelong
, lo que podría ser más lento queint
.Respuestas:
long
ylong int
son idénticos Así sonlong long
ylong long int
. En ambos casos, elint
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 comolong
.Las partes de control del estándar (C ++ 11, pero esto ha existido durante mucho tiempo) son, por ejemplo
3.9.1 Fundamental types
, la sección 2 (una sección posterior proporciona reglas similares para los tipos integrales sin signo):También hay una tabla 9
7.1.6.2 Simple type specifiers
, que muestra las "asignaciones" de los especificadores a los tipos reales (mostrando queint
es opcional), una sección de la cual se muestra a continuación:Tenga en cuenta la distinción entre el especificador y el tipo. El especificador es cómo 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 para ellong int
tipo. Lo mismo paralong long
ser un especificador para ellong long int
tipo.Aunque el estándar C ++ en sí mismo no especifica los rangos mínimos de los tipos integrales, sí cita C99, en
1.2 Normative references
, como aplicable. Por lo tanto,C99 5.2.4.2.1 Sizes of integer types <limits.h>
se aplican los rangos mínimos establecidos en .En términos de
long double
, eso es en realidad un valor de coma flotante en lugar de un número entero. De manera similar a los tipos integrales, se requiere tener al menos tanta precisión comodouble
ay proporcionar un superconjunto de valores sobre ese tipo (es decir, al menos esos valores, no necesariamente más valores).fuente
unsigned
yunsigned int
long
tiene al menos 32 bits (2 ^ 31-1 en cualquier lado de cero) ylong long
es de al menos 64 (2 ^ 63-1 en cualquier lado).long double
se garantiza que tiene al menos el rango dedouble
, pero puede ser el mismo. Depende de la computadora. Algunas FPU tienen precisión extendida; los chips x87 tenían precisión simple de 32 bits, precisión doble de 64 bits y precisión extendida de 80 bits.Long y long int son de al menos 32 bits.
long long y long long int son al menos 64 bits. Debe estar utilizando un compilador c99 o mejor.
los dobles largos son un poco extraños. Búscalos en Wikipedia para más detalles.
fuente
long
es equivalente along int
, tal comoshort
es equivalente ashort int
. Along int
es un tipo integral con signo que tiene al menos 32 bits, mientras que along long
olong long int
es un tipo integral con signo tiene al menos 64 bits.Esto no significa necesariamente que a
long long
sea más ancho que along
. Muchas plataformas / ABI usan elLP64
modelo, dondelong
(y punteros) tienen 64 bits de ancho. Win64 usaLLP64
, dondelong
todavía tiene 32 bits, ylong long
(y los punteros) tienen 64 bits de ancho.Hay un resumen bien de los modelos de datos de 64 bits aquí .
long double
no garantiza mucho más que será al menos tan ancho como adouble
.fuente
Esto parece confuso porque está tomando
long
como un tipo de datos en sí mismo.long
no es más que la abreviatura paralong int
cuando lo está usando solo.long
es un modificador, puedes usarlodouble
también comolong double
.long
==long int
.Ambos toman 4 bytes.
fuente
Históricamente, en los primeros tiempos de C, cuando los procesadores tenían una longitud de palabra de 8 o 16 bits,
int
era idéntico al de hoyshort
(16 bits). En cierto sentido, int es un tipo de datos más abstracto quechar
,short
,long
olong long
, como no se puede estar seguro sobre el ancho de bits.Al definir
int n;
, podría 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 traduzcanint
a 64 bits. Entonces, cuando desee que su variable tenga 32 bits y no más, mejor use un explícitolong
como tipo de datos.[Editar:
#include <stdint.h>
parece ser la forma correcta de garantizar los anchos de bits utilizando los tipos int ## _ t, aunque todavía no es parte del estándar.]fuente
long
se garantiza que al menos 32 bits. (Los estándares pueden cambiar mucho.) El borrador actual de C ++ 14 solo dice: @CM "Las entradas simples tienen el tamaño natural sugerido por la arquitectura del entorno de ejecución. Los otros tipos de enteros firmados se proporcionan para satisfacer necesidades especiales" (sección 3.9.1 ) No encontré ninguna palabra sobre las relaciones de longitud de varias entradas en él. __int32 no es realmente parte del estándar, pero desde C ++ 11 hay typedefs disponibles como int_fast32_t o int_least32_t disponibles para obtener exactamente lo que desea.char
era casi unánimemente de 8 bits,short
tenía 16 ylong
32;int
podría ser 16 o 32. Nota para algunas plataformas (especialmente el 68000), tanto de 16 bits como de 32 bitsint
eran bastante comunes, y de hecho algunos compiladores tenían opciones de soporte. Por lo tanto, se esperaba que el código que debía ser portátil se usarashort
olong
preferiríaint
.Mientras que en Java a
long
siempre tiene 64 bits, en C ++ esto depende de la arquitectura de la computadora y del sistema operativo . Por ejemplo, along
es de 64 bits en Linux y 32 bits en Windows (esto se hizo para mantener la compatibilidad con versiones anteriores, permitiendo que los programas de 32 bits se compilen en Windows de 64 bits sin ningún cambio).Se considera un buen estilo de C ++ para evitar
short int long ...
y en su lugar usar:Estos (
int*_t
) se pueden usar después de incluir el<cstdint>
encabezado.size_t
está en<stdlib.h>
.fuente