2011-12-04 13 views
12

Estoy usando Ubuntu 10.10 (64 bit) con gcc y quería usar un entero de 64 bits en mi programa C++.Representando un entero de 64 bits en GNU/Linux

En mi sistema, las salidas de sizeof(long), sizeof(long long int) y sizeof(int64_t) son todas de 8 bytes (64 bits).

¿Qué calificador (long, long long, o int64_t) recomendaría para el uso de enteros de 64 bits?

Respuesta

25

int64_t - Esto se debe a que es la representación más portátil. Los otros dos podrían representarse de manera diferente en otras máquinas.

+0

+1. Considere Win64 LLP64 y Unix LP64: http://en.wikipedia.org/wiki/64-bit#64-bit_data_models –

8

int64_t. Si necesita 64 bits, explíquelo explícitamente. El tamaño de largo y largo depende de la máquina.

8

¿Necesita exactamente 64 bits o al menos 64 bits?

Use cualquiera de int64_t, int_least64_t, o int_fast64_t expresa más claramente su intención. (Es casi seguro que los tres sean del mismo tipo en los sistemas actuales, pero documentar su intención es valioso).

Todas las implementaciones deben proporcionar int_least64_t y int_fast64_t. Al menos teóricamente es posible que int64_t no exista (digamos, si el compilador tiene un tipo de 128 bits pero no un tipo de 64 bits, o si los enteros con signo no se representan con el complemento 2).

(Pero en cada aplicación C99-ish que he visto, long long es exactamente 64 bits, e int64_t hubiera).

+1

+1 para el recordatorio de los alias menos rápidos y de tipo. –

0

definir el tipo de medida para entero de 64 bits y lo utilizan en su código. Use la directiva #ifdef para que el compilador pueda elegir la correcta. El ejemplo para la unificación de algunos enteros:

#ifdef (_MSC_VER) 

#include <basetsd.h> 

#define int8_t INT8 
#define uint8_t UINT8 
#define int16_t INT16 
#define uint16_t UINT16 
#define int32_t INT32 
#define uint32_t UINT32 
#define int64_t INT64 
#define uint64_t UINT64 

#else 

#include <inttypes.h> 

#endif 

typedef uint8_t u8_t; 
typedef int8_t s8_t; 
typedef uint16_t u16_t; 
typedef int16_t s16_t; 
typedef uint32_t u32_t; 
typedef int32_t s32_t; 
typedef uint64_t u64_t; 
typedef int64_t s64_t; 
Cuestiones relacionadas