Nel mondo Unix, ci sono stati alcuni accordi possibili per le dimensioni dei numeri interi e puntatori per le piattaforme a 64 bit. I due per lo più ampiamente usati erano ILP64 (in realtà, solo pochi esempi di questo, Cray era uno di questi) e LP64 (per quasi tutto il resto). Gli acronynms provengono da "int, long, i puntatori sono 64 bit" e "long, i puntatori sono 64 bit".
Type ILP64 LP64 LLP64
char 8 8 8
short 16 16 16
int 64 32 32
long 64 64 32
long long 64 64 64
pointer 64 64 64
Il sistema ILP64 è stata abbandonata a favore di LP64 (cioè, quasi tutti successivi entranti utilizzati LP64, sulla base delle raccomandazioni del gruppo Aspen, solo i sistemi con una lunga eredità di funzionamento a 64 bit utilizzare un diverso schema). Tutti i moderni sistemi Unix a 64 bit utilizzano LP64. MacOS X e Linux sono entrambi moderni sistemi a 64 bit.
Microsoft utilizza uno schema diverso per la transizione a 64 bit: LLP64 ('long long, pointers are 64-bit'). Ciò ha il merito di significare che il software a 32 bit può essere ricompilato senza modifiche. Ha il demerito di essere diverso da quello che fanno tutti gli altri, e richiede anche la revisione del codice per sfruttare le capacità a 64 bit. C'è sempre stata una revisione necessaria; era solo una diversa serie di revisioni rispetto a quelle necessarie sulle piattaforme Unix.
Se si progetta il software in circolazione nomi di tipo integer indipendente dalla piattaforma, probabilmente utilizzando l'intestazione C99 <inttypes.h>
, che, quando i tipi sono disponibili sulla piattaforma, prevede, firmato (quotata) e unsigned (non quotate; prefisso con 'u'):
int8_t
- interi a 8 bit
int16_t
- interi a 16 bit
int32_t
- interi a 32 bit
int64_t
-64-bit tegers
uintptr_t
- interi senza segno abbastanza grande per contenere i puntatori
intmax_t
- il più grande formato di numero intero sulla piattaforma (potrebbero essere più grande di int64_t
)
È quindi possibile codificare l'applicazione utilizzando questi tipi dove conta e facendo molta attenzione ai tipi di sistema (che potrebbero essere diversi). C'è un tipo intptr_t
- un tipo intero con segno per contenere puntatori; si dovrebbe pianificare di non utilizzarlo o utilizzarlo solo come risultato di una sottrazione di due valori uintptr_t
(ptrdiff_t
).
Ma, come la domanda indica (increduli), ci sono diversi sistemi per le dimensioni dei tipi di dati interi su macchine a 64 bit. Abituati ad esso; il mondo non cambierà.
fonte
2008-12-21 17:03:11
Su Windows con MSVC++ int e long sono 32 bit: https://msdn.microsoft.com/en-us/library/3b2e7499.aspx. Tuttavia, per consentire ad es. i vettori per memorizzare più di 4G di articoli, size_t è 64 bit. Quindi è necessario utilizzare int64_t anziché int per eseguire iterate, ad es. vettori che possono contenere più di oggetti 4G. –
In ** Cygwin ** ['sizeof (long) == 8', anche su Windows] (http://stackoverflow.com/a/39207744/485343) :-) – rustyx
@SergeRogatch dovrebbero usare' size_t' o un tipo iteratore per iterare, non 'int' o' int64_t' –