Estoy haciendo la transición de Java a C ++ y tengo algunas preguntas sobre el longtipo 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 longes 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 longpodría ser más lento quelong, lo que podría ser más lento queint.Respuestas:
longylong intson idénticos Así sonlong longylong long int. En ambos casos, elintes 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 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 queintes 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,
longpor sí solo no es un tipo ni un modificador como plantea su pregunta, es simplemente un especificador para ellong inttipo. Lo mismo paralong longser un especificador para ellong long inttipo.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 comodoubleay proporcionar un superconjunto de valores sobre ese tipo (es decir, al menos esos valores, no necesariamente más valores).fuente
unsignedyunsigned intlongtiene al menos 32 bits (2 ^ 31-1 en cualquier lado de cero) ylong longes de al menos 64 (2 ^ 63-1 en cualquier lado).long doublese 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
longes equivalente along int, tal comoshortes equivalente ashort int. Along intes un tipo integral con signo que tiene al menos 32 bits, mientras que along longolong long intes un tipo integral con signo tiene al menos 64 bits.Esto no significa necesariamente que a
long longsea más ancho que along. Muchas plataformas / ABI usan elLP64modelo, dondelong(y punteros) tienen 64 bits de ancho. Win64 usaLLP64, dondelongtodaví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 doubleno garantiza mucho más que será al menos tan ancho como adouble.fuente
Esto parece confuso porque está tomando
longcomo un tipo de datos en sí mismo.longno es más que la abreviatura paralong intcuando lo está usando solo.longes un modificador, puedes usarlodoubletambié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,
intera idéntico al de hoyshort(16 bits). En cierto sentido, int es un tipo de datos más abstracto quechar,short,longolong 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 traduzcaninta 64 bits. Entonces, cuando desee que su variable tenga 32 bits y no más, mejor use un explícitolongcomo 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
longse 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.charera casi unánimemente de 8 bits,shorttenía 16 ylong32;intpodría ser 16 o 32. Nota para algunas plataformas (especialmente el 68000), tanto de 16 bits como de 32 bitsinteran 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 usarashortolongpreferiríaint.Mientras que en Java a
longsiempre tiene 64 bits, en C ++ esto depende de la arquitectura de la computadora y del sistema operativo . Por ejemplo, alonges 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_testá en<stdlib.h>.fuente