2012-02-16 8 views
23

Estoy tratando de portar mi código a 64 bits.int_least64_t vs int_fast64_t vs int64_t

Encontré que C++ proporciona tipos enteros de 64 bits, pero todavía estoy confundido al respecto.

En primer lugar, me encontré con cuatro diferentes 64bit int s:

int_least64_t 
int_fast64_t 
int64_t 
intmax_t 

y sus homólogos sin firmar. Los probé usando sizeof() y son de 8 bytes por lo que son de 64 bits.

¿Cuál es la diferencia entre ellos? ¿Cuál es el significado de los tipos least y fast? ¿Qué hay de intmax_t?

+6

Vale la pena conocer esos typedefs, pero ¿está seguro de que está viendo el problema correcto? "Portar a 64 bits" generalmente no debería requerir que cambie sus tipos. En el mejor de los casos, solo recompila. –

+0

@KerrekSB: Excelente punto. He actualizado mi respuesta para abordar eso también. –

+0

posible duplicado de [¿Cuál es la diferencia entre intXX_t e int_fastXX_t?] (Http://stackoverflow.com/questions/9239558/what-is-the-difference-between-intxx-t-and-int-fastxx-t) –

Respuesta

51

En su plataforma, todos son nombres para el mismo tipo de datos subyacente. En otras plataformas, no lo son.

int64_t se requiere que sea EXACTAMENTE de 64 bits. En arquitecturas con (por ejemplo) un byte de 9 bits, no estará disponible en absoluto.

int_least64_t es el tipo de datos más pequeño con al menos 64 bits. Si int64_t está disponible, se usará. Pero (por ejemplo) con una máquina de bytes de 9 bits, esto podría ser de 72 bits.

int_fast64_t es el tipo de datos con al menos 64 bits y el mejor rendimiento aritmético. Está allí principalmente por coherencia con int_fast8_t y int_fast16_t, que en muchas máquinas será de 32 bits, no de 8 o 16. En algunos años más, puede haber una arquitectura en la que la matemática de 128 bits sea más rápida que la de 64 bits, pero yo no No creo que exista hoy.


Si está transfiriendo un algoritmo, es probable que quieren estar usando int_fast32_t, ya que llevará a cabo ningún valor a su antiguo código de 32 bits puede manejar, pero habrá 64 bits si eso es más rápido. Si está convirtiendo punteros a números enteros (¿por qué?), Utilice intptr_t.

+0

+1, buena explicación. – ildjarn

+2

"En arquitecturas con (por ejemplo) un byte de 9 bits, no estará disponible en absoluto." Tal vez sea interesante mencionar que la definición original de POSIX de 'intN_t' (como una extensión a C90) permitía el relleno, por lo que podría tener un 'int64_t' de 72 bits, de los cuales se usan 8 bits para el relleno. – hvd

+0

corrígeme si estoy equivocado: sobre int64_t, si tengo una plataforma de 8 bits se definirá, y si tengo otra plataforma que no sea de 64 bits no se definirá, ¿está bien? ; sobre int_least64_t: se definirá solo si tengo una plataforma de 64 bits como mínimo o grande que la plataforma de 64 bits, pero si la plataforma no es definida en 64 bits, es cierto y en el último int_fast64_t es el predeterminado, por ejemplo, si tengo un 64bit plataforma se definirá como _int64 si yo, y así sucesivamente, pero con la condición de que sea arquitectura de 8 bits como mínimo, y gracias. – user722528

11

int64_t tiene exactamente 64 bits. Puede no estar definido para todas las plataformas.

int_least64_t es el tipo más pequeño con al menos 64 bits.

int_fast64_t es el tipo que es más rápido de procesar, con al menos 64 bits.

En un procesador de 32 o 64 bits, todos serán definidos, y todos tendrán 64 bits. En un procesador hipotético de 73 bits, int64_t no se definirá (ya que no hay ningún tipo con exactamente 64 bits), y los demás tendrán 73 bits.

Cuestiones relacionadas