Um integer é um número sem parte fracionária.
No 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 vantajoso em certos contextos de programação, como indexação de arrays e gerenciamento de memória.
O Cairo também oferece suporte a inteiros com sinal, que começam com o prefixo i.
Esses 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 a variante usa.
Por exemplo, um i8 pode armazenar números de $-2^7$ a $2^7 - 1$, o que corresponde a $-128$ até $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 | ------ |
Existe também um tipo inteiro especial chamado usize, que atualmente é apenas um alias para u32.
Esse tipo pode desempenhar um papel mais distinto no futuro, quando o Cairo puder ser compilado para MLIR (Multi-Level Intermediate Representation).
Você pode escrever literais inteiros em qualquer uma das formas mostradas na tabela abaixo.
Repare que literais numéricos que podem ser de mais de um tipo permitem um sufixo de tipo, como 57_u8, para designar o tipo.
Também é possível usar um separador visual _ em 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 você sabe qual tipo de inteiro usar?
Tente estimar o valor máximo que o seu inteiro pode ter e escolha o tamanho adequado.
A principal situação em que você usaria usize é ao indexar algum tipo de coleção.
O Cairo oferece as operações matemáticas básicas que você esperaria para todos os tipos de inteiros: adição, subtração, multiplicação, divisão e resto.
A divisão de inteiros trunca em direção ao zero, para o inteiro mais próximo.
O código a seguir mostra como você usaria cada operação numérica em uma 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 nessas instruções usa um operador matemático e resulta em um único valor, que é então associado a uma variável.
A lista de todos os operadores que o Cairo oferece está em The Cairo Book.