2011-12-04 2 views
12

Sto usando Ubuntu 10.10 (64 bit) con gcc e volevo usare un numero intero a 64 bit nel mio programma C++.Rappresenta un numero intero a 64 bit in GNU/Linux

Sul sistema le uscite di sizeof(long), sizeof(long long int) e sizeof(int64_t) sono tutti 8 byte (64 bit).

Quale qualificatore (long, long long o int64_t) si consiglia di utilizzare numeri interi a 64 bit?

risposta

25

int64_t - Questo perché è la rappresentazione più portatile. Gli altri due potrebbero essere rappresentati in modo diverso su altre macchine.

+0

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

8

int64_t. Se hai bisogno di 64 bit, dichiaralo esplicitamente. La dimensione del lungo e del lungo varia a seconda della macchina.

8

Avete bisogno esattamente di 64 bit o almeno 64 bit?

Utilizzare il numero di int64_t, int_least64_t o int_fast64_t esprime chiaramente il proprio intento. (Tutti e tre sono quasi certamente dello stesso tipo sui sistemi attuali, ma la documentazione del tuo intento è preziosa.)

Tutte le implementazioni devono fornire int_least64_t e int_fast64_t. È almeno teoricamente possibile che int64_t non esista (ad esempio, se il compilatore ha un tipo a 128 bit ma non a 64 bit o se gli interi con segno non sono rappresentati usando il complemento a 2).

(Ma in ogni implementazione C99-ish che abbia mai visto, long long è esattamente a 64 bit, e int64_t esiste.)

+1

+1 per il promemoria degli alias di tipo minimo e veloce. –

0

Definire tipo personalizzato per 64-bit integer e utilizzarlo nel codice. Utilizzare la direttiva #ifdef per il compilatore può scegliere quello giusto. L'esempio per l'unificazione di alcuni numeri interi:

#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;