Um integer é um número sem parte fracionária.
Em Cairo, a declaração de tipo para inteiros indica o número de bits que o programador pode usar para armazenar o valor.
Os inteiros sem sinal só podem representar números positivos e o número 0 (zero), o que pode ser benéfico em certos contextos de programação, como a indexação de arrays e a gestão de memória.
O Cairo também oferece suporte para inteiros com sinal, começando com o prefixo i.
Estes inteiros podem representar valores positivos e negativos, com tamanhos que vão de i8 a i128.
Cada variante com sinal pode armazenar números de $-2^{n-1}$ a $2^{n-1} - 1$, inclusive, em que $n$ é o número de bits que essa variante usa.
Por exemplo, um i8 pode armazenar números de $-2^7$ a $2^7 - 1$, o que equivale a $-128$ a $127$.
| Tamanho | Sem sinal | Com sinal |
|---|---|---|
| 8 bits | u8 | i8 |
| 16 bits | u16 | i16 |
| 32 bits | u32 | i32 |
| 64 bits | u64 | i64 |
| 128 bits | u128 | i128 |
| 256 bits | u256 | ------ |
Há também um tipo de inteiro especial chamado usize, que atualmente é apenas um alias para u32.
Este tipo pode vir a desempenhar um papel mais distinto no futuro, quando o Cairo puder ser compilado para MLIR (Representação Intermédia Multinível).
Podes escrever literais inteiros em qualquer uma das formas mostradas na tabela abaixo.
Repara que os literais numéricos que podem ser de vários tipos numéricos permitem um sufixo de tipo, como 57_u8, para designar o tipo.
Também é possível usar um separador visual _ nos literais numéricos, para melhorar a legibilidade do código.
| Literais numéricos | Exemplo |
|---|---|
| Decimal | 98222 |
| Hexadecimal | 0xff |
| Octal | 0o04321 |
| Binário | 0b01 |
Então, como sabes que tipo de inteiro deves usar?
Tenta estimar o valor máximo que o teu inteiro pode ter e escolhe o tamanho adequado.
A principal situação em que usarias usize é quando indexas algum tipo de coleção.
O Cairo suporta as operações matemáticas básicas que esperarias para todos os tipos de inteiros: adição, subtração, multiplicação, divisão e resto.
A divisão inteira trunca em direção a zero, para o inteiro mais próximo.
O código seguinte mostra como usarias cada operação numérica numa instrução let:
fn main() {
// addition
let sum = 5_u128 + 10_u128;
// subtraction
let difference = 95_u128 - 4_u128;
// multiplication
let product = 4_u128 * 30_u128;
// division
let quotient = 56_u128 / 32_u128; // result is 1
let quotient = 64_u128 / 32_u128; // result is 2
// remainder
let remainder = 43_u128 % 5_u128; // result is 3
}
Cada expressão nestas instruções usa um operador matemático e resulta num único valor, que depois é associado a uma variável.
A lista de todos os operadores que o Cairo fornece pode ser encontrada em The Cairo Book.