Nel mondo Unix, c'erano alcune possibili disposizioni per le dimensioni di numeri interi e puntatori per piattaforme a 64 bit. I due maggiormente utilizzati erano ILP64 (in realtà, solo pochi esempi di questo; Cray era uno di questi) e LP64 (per quasi tutto il resto). Gli acronimi provengono da "int, long, puntatori sono a 64 bit" e "long, puntatori sono a 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 è stato abbandonato a favore di LP64 (ovvero, quasi tutti i partecipanti successivi hanno utilizzato LP64, in base alle raccomandazioni del gruppo Aspen; solo i sistemi con una lunga tradizione di operazioni a 64 bit utilizzano uno schema diverso). 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'). Questo 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 che il codice venga rivisto per sfruttare le capacità a 64 bit. C'era sempre la revisione necessaria; era solo una serie diversa di revisioni da quelle necessarie sulle piattaforme Unix.
Se si progetta il proprio software attorno a nomi di numeri interi neutri per la piattaforma, probabilmente usando l' <inttypes.h>
intestazione C99 , che, quando i tipi sono disponibili sulla piattaforma, fornisce, con segno (elencato) e non firmato (non elencato; prefisso con 'u'):
int8_t
- Numeri interi a 8 bit
int16_t
- Numeri interi a 16 bit
int32_t
- Numeri interi a 32 bit
int64_t
- Numeri interi a 64 bit
uintptr_t
- numeri interi senza segno abbastanza grandi da contenere puntatori
intmax_t
- dimensione massima dell'intero sulla piattaforma (potrebbe essere maggiore di int64_t
)
È quindi possibile codificare l'applicazione utilizzando questi tipi dove è importante e facendo molta attenzione ai tipi di sistema (che potrebbero essere diversi). Esiste un intptr_t
tipo: un tipo intero con segno per contenere i puntatori; dovresti pianificare di non usarlo o di usarlo solo come risultato di una sottrazione di due uintptr_t
valori ( ptrdiff_t
).
Ma, come sottolinea la domanda (incredulo), esistono sistemi diversi per le dimensioni dei tipi di dati interi su macchine a 64 bit. Abituarsi ad esso; il mondo non cambierà.