En el mundo de Unix, hubo algunos arreglos posibles para los tamaños de enteros y punteros para plataformas de 64 bits. Los dos más ampliamente utilizados fueron ILP64 (de hecho, solo unos pocos ejemplos de esto; Cray fue uno de ellos) y LP64 (para casi todo lo demás). Los acrónimos provienen de 'int, long, los punteros son de 64 bits' y 'long, los punteros son de 64 bits'.
Type ILP64 LP64 LLP64
char 8 8 8
short 16 16 16
int 64 32 32
long 64 64 32
long long 64 64 64
pointer 64 64 64
El sistema ILP64 fue abandonado en favor de LP64 (es decir, los participantes casi todos los posteriores utilizados LP64, con base en las recomendaciones del grupo de Aspen, y sólo los sistemas con una larga tradición de funcionamiento de 64 bits utilizar una diferente esquema). Todos los sistemas Unix de 64 bits modernos usan LP64. MacOS X y Linux son ambos sistemas modernos de 64 bits.
Microsoft usa un esquema diferente para la transición a 64 bits: LLP64 ('long long, pointers are 64-bit'). Esto tiene el mérito de significar que el software de 32 bits puede recompilarse sin cambios. Tiene el inconveniente de ser diferente de lo que hacen los demás, y también requiere que se revise el código para aprovechar las capacidades de 64 bits. Siempre hubo una revisión necesaria; era solo un conjunto diferente de revisiones de las que se necesitaban en las plataformas de Unix.
Si diseña su software alrededor de nombres de tipo entero de plataforma neutra, probablemente usando el encabezado C99 <inttypes.h>
, que, cuando los tipos están disponibles en la plataforma, proporciona, en firmado (en la lista) y sin signo (no incluido; prefijo con 'u'):
int8_t
- números enteros de 8 bits
int16_t
- enteros de 16 bits
int32_t
- enteros de 32 bits
int64_t
- 64 bits en tegers
uintptr_t
- enteros sin signo suficientemente grande para contener punteros
intmax_t
- mayor tamaño de número entero en la plataforma (podrían ser más grande que int64_t
)
continuación, puede codificar su aplicación utilizando este tipo donde importa y ser muy cuidadoso con los tipos de sistema (que pueden ser diferentes). Hay un tipo intptr_t
- un tipo de entero con signo para contener punteros; debe planear no usarlo, o solo usarlo como resultado de una resta de dos valores de uintptr_t
(ptrdiff_t
).
Pero, como la pregunta señala (con incredulidad), existen diferentes sistemas para los tamaños de los tipos de datos enteros en máquinas de 64 bits. Acostumbrarse a él; el mundo no va a cambiar
En Windows con MSVC++ int y largo son 32 bits: https://msdn.microsoft.com/en-us/library/3b2e7499.aspx. Sin embargo, para permitir, p. vectores para almacenar más de 4G de elementos, size_t es de 64 bits. Entonces uno necesita usar int64_t en lugar de int para iterar, p. vectores que pueden contener más de 4G elementos. –
En ** Cygwin ** ['sizeof (long) == 8', incluso en Windows] (http://stackoverflow.com/a/39207744/485343) :-) – rustyx
@SergeRogatch deberían usar' size_t' o un tipo de iterador para iterar, no 'int' o' int64_t' –