c++ - type - unsigned long long int




Dovrei usare long long o int64_t per il codice portatile? (2)

Il suggerimento generale è di usare int64_t al posto di long long , quando la portabilità è un obiettivo importante?

Sarei molto sorpreso se un compilatore offrisse int64_t ma non long long .

Se long long è presente, deve avere almeno 64 bit, quindi il casting da (u)int64_t a (unsigned) long long è value-preserving.

Se hai bisogno di un tipo con esattamente 64 bit, usa (u)int64_t , se hai bisogno di almeno 64 bit, (unsigned) long long va perfettamente bene, come sarebbe (u)int_least64_t .

Ho una base di codici open source scritta sia in C che in C ++. Sto cercando un tipo intero che garantisca almeno 64 bit di larghezza, che può essere compilato in modo affidabile sulla maggior parte delle macchine OS X (Intel, 64-bit) e Linux con compilatori C e C ++ open source, senza troppo lavoro extra sulla parte dell'utente finale. Windows e il supporto client a 32 bit non sono importanti in questo momento.

Ho eseguito alcuni test su OS X e l'ultimo GCC fornito con gli strumenti di sviluppo non supporta la modalità C + 11 (e quindi non sembra garantire una disponibilità di long long ). Clang non supporta questo, anche se supporta long long se la modalità C99 è abilitata, dopo una certa versione.

Il suggerimento generale è di usare int64_t al posto di long long , quando la portabilità è un obiettivo importante? Usare gli specificatori di formato sembra doloroso.

Posso int64_t in modo affidabile un int64_t a long long (e similmente all'equivalente unsigned con uint64_t ) per usarlo con le funzioni e le librerie esistenti che impiegano long long come parametri? (E di nuovo, naturalmente.)

In questa ottica, se spedisco un codice che richiede la funzionalità Clang non in GCC, Clang sostituirà GCC come compilatore di scelta su Linux? Questo compilatore è qualcosa che posso aspettarmi, per la maggior parte, quando offri il codice sorgente agli utenti finali?

Fondamentalmente, vorrei chiedere un consiglio ad altri sviluppatori che hanno usato entrambi i tipi per codice C e C ++ portatile, che potrebbe avere qualche suggerimento su quale potrebbe essere la migliore strada da percorrere a lungo termine, dato l'obiettivo di cui sopra in mente .


I tipi long long e unsigned long long sono standard C e standard C ++ con almeno 64 bit. Tutti i compilatori di cui sono a conoscenza forniscono questi tipi, tranne eventualmente in modalità -pedantic , ma in questo caso int64_t o uint64_t non saranno disponibili con i compilatori pre-C ++ 2011. Su tutti i sistemi è disponibile anche <stdint.h> . Cioè, per quanto posso dire, non importa molto come si scrive il tipo. L'obiettivo principale di <stdint.h> è quello di fornire la migliore corrispondenza per un numero specifico di bit. Se hai bisogno di almeno 64 bit ma vuoi anche sfruttare l'implementazione a digiuno di questo tipo, devi usare int_least64_t o uint_least64_t da <stdint.h> o <cstdint> (nel caso di quest'ultimo, i nomi sono definito nello spazio dei nomi std ).





long-long