O D fornece vários tipos básicos que sempre têm o mesmo
tamanho independentemente da plataforma - a única exceção
é o tipo real que fornece a maior precisão possível de ponto flutuante
possível. Não há diferença
entre o tamanho de um número inteiro, independentemente de o aplicativo
seja compilado para sistemas de 32 ou 64 bits.
| tipo | tamanho |
|---|---|
bool, byte, ubyte, char | 8-bit |
short, ushort, wchar | 16-bit |
int, uint, dchar | 32-bit |
long, ulong | 64-bit |
| tipo | tamanho |
|---|---|
float | 32-bit |
double | 64-bit |
real | >= 64-bit (geralmente 64-bit, mas 80-bit em Intel x86 32-bit) |
O prefixo u indica tipos unsigned. char se traduz em caracteres
caracteres UTF-8, wchar é usado em strings UTF-16 e dchar
em cadeias de caracteres UTF-32.
Uma conversão entre variáveis de tipos diferentes só é
permitida pelo compilador se não houver perda de precisão. No entanto,
uma conversão entre tipos de ponto flutuante
(por exemplo, double para float) é permitida.
Uma conversão para outro tipo pode ser forçada com o uso da expressão
cast(TYPE) myVar. No entanto, ela precisa ser usada com muito cuidado,
pois a expressão cast pode quebrar o sistema de tipos.
A palavra-chave especial auto cria uma variável e infere
seu tipo a partir do lado direito da expressão. auto myVar = 7
deduzirá o tipo int para myVar. Observe que o tipo ainda é
definido em tempo de compilação e não pode ser alterado, como em qualquer outra
variável com um tipo explicitamente fornecido.
Todos os tipos de dados têm uma propriedade .init para a qual são inicializados.
Para todos os números inteiros, essa propriedade é 0 e, para pontos flutuantes, é nan (não é um número).
Os tipos de ponto flutuante e integral têm uma propriedade .max para o valor mais alto que podem representar.
Os tipos integrais também têm uma propriedade .min para o valor mais baixo
que podem representar, enquanto os tipos de ponto flutuante têm uma propriedade .min_normal
que é definida como o menor valor normalizado representável que não é 0.
Os tipos de ponto flutuante também têm as propriedades .nan (valor NaN), .infinity
(valor infinito), .dig (número de dígitos decimais das precisões), .mant_dig
(número de bits na mantissa) e outras.
Cada tipo também tem uma propriedade .stringof que produz seu nome como uma string.
Em D, os índices geralmente têm o alias do tipo size_t, pois é um tipo que
é grande o suficiente para representar um deslocamento em toda a memória endereçável - isto é
uint para arquiteturas de 32 bits e ulong para arquiteturas de 64 bits.
O assert é uma expressão que verifica as condições no modo de depuração e aborta com um AssertionError se falhar.
O assert(0) é, portanto, usado para marcar código inacessível.