Pular para o conteúdo

Tipos de Dados

O Kriol é uma linguagem de tipagem estática. Cada variável tem um tipo definido em tempo de compilação que não pode mudar.

TipoEquivalente C aproximadoDescriçãoExemplo
intint64_tInteiro assinado de 64 bitsint x = 42;
numdoubleNúmero de vírgula flutuante 64-bitnum pi = 3.14;
boolboolValor booleano (sin / nau)bool ok = sin;
textuchar*Cadeia de caracteres (string)textu s = "oi";

Também existem tipos numéricos primitivos explícitos para controlar largura e sinal quando isso é importante:

FamíliaTipos
Inteiros com sinali8, i16, i32, i64, isize
Inteiros sem sinalu8, u16, u32, u64, usize
Ponto flutuantef32, f64

int é equivalente a i64, e num é equivalente a f64. Os nomes int e num vêm de interu e numeru.

Ao contrário do int do C, cuja largura depende da plataforma (tipicamente 32 bits), o int do Kriol tem sempre 64 bits. Para um inteiro de outra largura usa i8, i16, i32, u8, u16, u32 ou u64; para números reais de 32 bits usa f32.

Se não tiveres uma razão concreta para escolher outro, usa int e num. Os tipos de largura fixa servem quando o tamanho em bits importa: ler um formato de ficheiro, falar com hardware, ou poupar memória num array grande.

Um valor que não caiba no tipo ou é recusado pelo compilador (se for um literal) ou dá a volta em execução, por isso vale saber os limites:

TipoMínimoMáximo
i8-128127
u80255
i16-32 76832 767
u16065 535
i32-2 147 483 6482 147 483 647
u3204 294 967 295
i64 / int-9 223 372 036 854 775 8089 223 372 036 854 775 807
u64018 446 744 073 709 551 615

isize e usize são do tamanho de um ponteiro; na versão atual comportam-se como i64 e u64.

Os reais seguem o padrão IEEE 754: f32 tem cerca de 7 dígitos decimais de precisão e f64 (num) cerca de 15.

int a = 10;
int b = -42;
int c = 0;
u8 byte = 255;
i32 delta = -12;
usize tamanho = 3;

Um literal inteiro adapta-se ao tipo onde é usado, desde que caiba nele. Por isso u8 byte = 255; funciona sem cast. Se não couber, o literal fica int e o compilador recusa a atribuição:

u8 byte = 255; // ok
u8 fora = 256; // ERRO: não se pode guardar um valor do tipo 'int'
// na variável 'fora', que é do tipo 'u8'
num pi = 3.14159;
num negativo = -2.5;
num inteiro_como_num = 4.0;
f32 pequeno = 1.5;
f64 grande = 10.25;

Um literal real precisa de pelo menos um dígito antes e depois do ponto: 4.0 é válido, 4. e .5 não. Também não há notação de expoente nos literais, por isso 1e10 não é código Kriol válido; escreve o número por extenso, ou converte um texto com num::konverti("1e10").

O Kriol usa sin (verdadeiro) e nau (falso) em vez de true/false:

bool ativo = sin;
bool desligado = nau;

Podem usar aspas duplas ou simples, e suportam interpolação com f-strings:

textu nome = "Kriol";
textu outro = 'Cabo Verde';
textu saudacao = f"Olá, {nome}!";

Um textu guarda e imprime-se bem, mas na versão atual ainda não tem operações próprias: não se junta com +, não se compara com == e não se acede a um carácter com [ ]. A f-string é a forma de juntar texto. Vê Strings e Interpolação.

Saber isto evita surpresas quando o número que imprimes não tem o aspeto que escreveste:

Valormostran escrevePorquê
4242tal e qual
sin / nausin / nauas mesmas palavras da linguagem
2.02os zeros à direita não são escritos
1.0 / 3.00.333333os reais saem com 6 dígitos significativos
[1, 2, 3][1, 2, 3]um array sai inteiro, entre parênteses rectos

O Kriol suporta conversões implícitas de alargamento quando não há perda de informação, como int para num, inteiros menores para inteiros maiores compatíveis, ou inteiros para ponto flutuante. Por exemplo:

int x = 5;
num y = x; // ok, alargamento automático

Além dos tipos primitivos, podes declarar moldes com a palavra-chave molda:

molda Pessoa {
textu nomi;
int idadi;
}
Pessoa pessoa = Pessoa{nomi = "jose", idadi = 60};

Consulta a página Moldes (molda) para detalhes.

Arrays são colecções de tamanho fixo do mesmo tipo. Consulta a página Arrays para a documentação completa.

int[5] numeros = [1, 2, 3, 4, 5];

Nenhuma destas ausências é um esquecimento; todas estão na lista de trabalho futuro.

  • Nenhum valor nulo: não existe null, nil nem None, e toda a declaração leva um valor inicial.
  • Nenhum tipo de carácter individual: não há char; um carácter sozinho é um textu de um carácter.
  • Nenhuma colecção de tamanho variável: os arrays têm tamanho fixo, decidido na compilação.