usize em Zig — O que é e Como Usar
Definição
usize é o tipo inteiro sem sinal (unsigned) cujo tamanho corresponde ao tamanho nativo de um ponteiro na arquitetura-alvo. Em sistemas de 64 bits, usize tem 64 bits (8 bytes); em sistemas de 32 bits, tem 32 bits (4 bytes). É o tipo padrão para indexação de arrays, comprimento de slices e aritmética de ponteiros.
Em termos práticos, usize é equivalente ao size_t do C.
Por que usize Importa
- Indexação: Todo acesso a arrays e slices em Zig usa
usizecomo tipo de índice. - Tamanhos: O campo
.lende slices e arrays retornausize. - Portabilidade: Garante que o código funcione em arquiteturas de 32 e 64 bits sem alteração.
- Aritmética de ponteiros: Operações de ponteiro usam
usizepara deslocamentos.
Exemplo Prático
Indexação de Arrays e Slices
const std = @import("std");
pub fn main() void {
const dados = [_]u8{ 10, 20, 30, 40, 50 };
// .len retorna usize
const tamanho: usize = dados.len;
std.debug.print("Tamanho: {}\n", .{tamanho}); // 5
// Índice de iteração é usize
for (dados, 0..) |valor, i| {
std.debug.print("[{}] = {}\n", .{ i, valor });
}
}
Conversão entre Tipos Inteiros
const std = @import("std");
fn buscar(slice: []const u8, indice: usize) ?u8 {
if (indice >= slice.len) return null;
return slice[indice];
}
pub fn main() void {
const dados = [_]u8{ 'Z', 'i', 'g' };
// Converter u32 para usize com @intCast
const pos: u32 = 1;
const resultado = buscar(&dados, @intCast(pos));
if (resultado) |byte| {
std.debug.print("Encontrado: {c}\n", .{byte}); // 'i'
}
}
Tamanho em Bytes com @sizeOf
const std = @import("std");
pub fn main() void {
std.debug.print("usize = {} bytes\n", .{@sizeOf(usize)}); // 8 em 64-bit
std.debug.print("isize = {} bytes\n", .{@sizeOf(isize)}); // 8 em 64-bit
std.debug.print("*u8 = {} bytes\n", .{@sizeOf(*u8)}); // 8 em 64-bit
// Todos têm o mesmo tamanho: usize == tamanho de ponteiro
}
usize vs isize
| Tipo | Descrição |
|---|---|
usize | Inteiro sem sinal do tamanho de um ponteiro (0 a 2^N-1) |
isize | Inteiro com sinal do tamanho de um ponteiro (-2^(N-1) a 2^(N-1)-1) |
Use usize para índices e tamanhos (que nunca são negativos). Use isize quando precisar representar deslocamentos que podem ser negativos.
Armadilhas Comuns
- Misturar tipos inteiros: Usar
u32oui32como índice exige conversão explícita com@intCast. Zig não faz conversão implícita. - Overflow em 32 bits: Código que funciona em 64 bits pode ter overflow em 32 bits se os valores excederem 4 GB. Teste em ambas as arquiteturas.
- Subtração de usize: Como
usizeé unsigned, subtrair um valor maior do menor causa panic em modo safe. Usestd.math.subpara subtração segura. - Confundir com u64:
usizenem sempre é 64 bits. Em sistemas de 32 bits, éu32. Usaru64ondeusizeé esperado requer conversão.
Termos Relacionados
- Slice — Referência a sequência contígua com
.lendo tipo usize - Pointer Types — Tipos de ponteiro em Zig
- comptime_int — Inteiro de precisão arbitrária em comptime
- Type Coercion — Regras de conversão de tipos