2012-02-16 8 views
23

Sto provando a portare il mio codice a 64 bit.int_least64_t vs int_fast64_t vs int64_t

Ho trovato che C++ fornisce tipi interi a 64 bit, ma sono ancora confuso su di esso.

In primo luogo, ho trovato quattro diverse 64bit int s:

int_least64_t 
int_fast64_t 
int64_t 
intmax_t 

e le loro controparti non firmati. Li ho testati usando sizeof() e sono 8 byte quindi sono a 64 bit.

Qual è il diverso tra loro? Qual è il significato dei tipi least e fast? Che mi dici di intmax_t?

+6

Questi typedef sono degni di nota, ma sei sicuro di avere il problema giusto? "Porting to 64 bit" non dovrebbe in genere richiedere la modifica dei tipi. Nel migliore dei casi devi ricompilare. –

+0

@KerrekSB: punto eccellente. Ho aggiornato la mia risposta per rispondere anche a questo. –

+0

possibile duplicato di [Qual è la differenza tra intXX_t e int_fastXX_t?] (Http://stackoverflow.com/questions/9239558/what-is-the-difference-between-intxx-t-and-int-fastxx-t) –

risposta

51

Sulla vostra piattaforma, sono tutti i nomi per lo stesso tipo di dati sottostante. Su altre piattaforme, non lo sono.

int64_t è necessario ESATTAMENTE 64 bit. Su architetture con (ad esempio) un byte da 9 bit, non sarà affatto disponibile.

int_least64_t è il tipo di dati più piccolo con almeno 64 bit. Se int64_t è disponibile, verrà utilizzato. Ma (per esempio) con una macchina a 9 bit, questo potrebbe essere 72 bit.

int_fast64_t è il tipo di dati con almeno 64 bit e le migliori prestazioni aritmetiche. È presente principalmente per coerenza con int_fast8_t e int_fast16_t, che su molte macchine sarà a 32 bit, non a 8 o a 16. In qualche altro anno, potrebbe esserci un'architettura in cui la matematica a 128 bit è più veloce di 64-bit, ma non Penso che esista oggi.


Se state portando un algoritmo, che probabilmente vuole essere utilizzando int_fast32_t, dal momento che si terrà alcun valore il vecchio codice a 32 bit in grado di gestire, ma sarà a 64 bit se è più veloce. Se stai convertendo i puntatori in numeri interi (perché?), Utilizza intptr_t.

+0

+1, buona spiegazione. – ildjarn

+2

"Su architetture con (ad esempio) un byte da 9 bit, non sarà affatto disponibile." Forse è interessante menzionare che la definizione POSIX originale di 'intN_t' (come estensione a C90) consentiva il padding, quindi si poteva avere un' int64_t' a 72 bit di cui 8 bit per il padding. – hvd

+0

correggimi se ho torto: a proposito di int64_t, se avrò una piattaforma a 8 bit verrà definita, e se avrò un'altra piattaforma che non è a 64 bit non verrà definita, è OK? ; su int_least64_t: definirà solo se dispongo di una piattaforma a 64 bit almeno o grande di 64 bit, ma se la piattaforma meno di 64 bit non verrà definita, è quella vera e nell'ultima int_fast64_t è l'impostazione predefinita ad esempio se ho un 64 bit piattaforma sarà definita come _int64 se io e così via, ma con le condizioni per essere almeno l'architettura a 8 bit, e grazie. – user722528

11

int64_t ha esattamente 64 bit. Potrebbe non essere definito per tutte le piattaforme.

int_least64_t è il tipo più piccolo con almeno 64 bit.

int_fast64_t è il tipo più veloce da elaborare, con almeno 64 bit.

Su un processore a 32 o 64 bit, saranno tutti definiti e avranno tutti 64 bit. Su un ipotetico processore a 73 bit, non sarà definito int64_t (poiché non esiste un tipo con esattamente 64 bit) e gli altri avranno 73 bit.

Problemi correlati