No mundo Unix, havia alguns arranjos possíveis para o tamanho de números inteiros e ponteiros para plataformas de 64 bits. Os dois mais amplamente utilizados foram ILP64 (na verdade, apenas alguns exemplos disso; Cray era um deles) e LP64 (para quase todo o resto). Os acronynms vêm de 'int, long, ponteiros são de 64 bits' e 'longos, ponteiros são de 64 bits'.
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
O sistema ILP64 foi abandonado em favor do LP64 (ou seja, quase todos os participantes posteriores usaram o LP64, com base nas recomendações do grupo Aspen; somente sistemas com uma longa herança de operação de 64 bits usam um esquema diferente). Todos os sistemas Unix modernos de 64 bits usam LP64. MacOS X e Linux são sistemas modernos de 64 bits.
A Microsoft usa um esquema diferente para fazer a transição para 64 bits: LLP64 ('longo, ponteiros são 64 bits'). Isso tem o mérito de significar que o software de 32 bits pode ser recompilado sem alterações. Ele tem o demérito de ser diferente do que todo mundo faz e também exige que o código seja revisado para explorar as capacidades de 64 bits. Sempre houve revisão necessária; era apenas um conjunto diferente de revisões das necessárias nas plataformas Unix.
Se você projetar seu software em torno de nomes de tipos inteiros neutros em plataforma, provavelmente usando o <inttypes.h>
cabeçalho C99 , que, quando os tipos estão disponíveis na plataforma, fornece, assinado (listado) e não assinado (não listado; prefixo com 'u'):
int8_t
- inteiros de 8 bits
int16_t
- inteiros de 16 bits
int32_t
- números inteiros de 32 bits
int64_t
- números inteiros de 64 bits
uintptr_t
- números inteiros não assinados grandes o suficiente para conter ponteiros
intmax_t
- maior tamanho de número inteiro na plataforma (pode ser maior que int64_t
)
Em seguida, você pode codificar seu aplicativo usando esses tipos onde for importante e tendo muito cuidado com os tipos de sistema (que podem ser diferentes). Há um intptr_t
tipo - um tipo inteiro assinado para conter ponteiros; você deve planejar não usá-lo ou apenas usá-lo como resultado de uma subtração de dois uintptr_t
valores ( ptrdiff_t
).
Mas, como a pergunta aponta (em descrença), existem sistemas diferentes para os tamanhos dos tipos de dados inteiros em máquinas de 64 bits. Acostume-se a isso; o mundo não vai mudar.