Tipos de datos básicos

Probablemente ya te has dado cuenta, por los ejemplos anteriores, de que Zig usa tipos de datos de  forma muy estricta. En algunos casos Zig es capaz de adivinar automáticamente estos tipos. A esto se le llama, técnicamente:  inferir el tipo.

 const n_x = 1;

Aquí por ejemplo zig infiere que n_x es un número entero, pero también podemos poner de forma explícita el tipo.

 const n_x: u1 = 1;

¿Tipo u1? Sí. La u viene de unsigned (entero sin signo), y el 1 indica el número de bits que usará el dato para almacenar su valor. Un bit es la unidad mínima de representación de datos en memoria. Puede tomar solo dos valores: 0 ó 1.

Si pensamos en un bit como una casilla que puede almacenar un 0 o un 1:

0

bit

Es evidente que con un solo bit podemos representar un 0 o un 1, nada más y nada menos. Al tener solo un bit el número más pequeño que podemos representar es el 0 y el máximo es 1.

0

ó

1

2⁰

2⁰

Como u1 es usar un solo bit si intentamos asignar un número más grande de 1 a un tipo de dato u1 sucederá lo siguiente:

const_2.zig

const std = @import("std");

pub fn main() u8 {

    const n_a: u1 = 2;

    return n_a;

}

$ zig run const_2.zig

const_2.zig:4:21: error: type 'u1' cannot represent integer value '2'

    const n_a: u1 = 2;

                    ^

El compilador nos dice que no podemos representar el valor 2 con un entero de un bit.

¿Qué podemos hacer? ¿Cuántos bits se necesitan para representar el número 2?

Hay un viejo chiste entre programadores que dice: 

Hay 10  tipos de personas - los que saben binario y los que no.

   const n_x: u2 = 2;

Si cambiamos el tipo a u2 quiere decir que ya tendríamos 2 bits para nuestro dato. Son cuatro combinaciones posibles:

  0

0

0

2⁰

1

0

1

2⁰

 2

1

0

2⁰

3

1

1

2⁰

Con dos bits podemos representar desde 0 hasta:

2¹ + 2⁰ = 2 + 1 = 3

Es decir, los valores entre 0 y 3.

¿Hace falta conocer todos los tipos al detalle y de memoria?

Para empezar, es suficiente familiarizarse con: u8, i32, usize, f32, bool y void.

Por tener una foto global e ir conociendo las posibilidades de los tipos primitivos de Zig aquí tienes un resumen:

Booleanos

Los valores que puede tomar un tipo booleano son sólo 2: true (Verdadero) o false (Falso). Estos junto a los operadores booleanos, que veremos en el próximo capítulo, hacen posible evaluar expresiones y después tomar diferentes decisiones en nuestro código.

bool

Valores verdadero o falso

Números enteros

Zig permite usar tipos de números enteros de cualquier tamaño, como u3, i5, u37. Esto no es algo común en otros lenguajes y sirve para afinar el uso de memoria al máximo.

u8

Entero sin signo de 8 bits

0 a 255

i8

Entero con signo de 8 bits

-128 a 127

u16

Entero sin signo de 16 bits

0 a 65,535

i16

Entero con signo de 16 bits

-32,768 a 32,767

u32

Entero sin signo de 32 bits

0 a ~4 mil millones

i32

Entero con signo de 32 bits

~ -2 mil millones a 2 mil millones

usize

Entero sin signo del tamaño del sistema (útil para contar cosas como bytes)

Números de coma flotante

f16

Precisión Baja (16 bits)

Muy compacto, poco usado

f32

Precisión Media (32 bits)

Suficiente para la mayoría

f64

Precisión Alta (64 bits)

Alta precisión numérica

Otros tipos

void

Sin valor (para las funciones que no devuelven nada)

noreturn

Algo que no vuelve nunca (como return, unreachable)

comptime_int

Tipo especial solo usado en tiempo de compilación

anyerror

Cualquier tipo de error, para la gestión de errores

type

El tipo de los tipos (sí, es raro pero útil en Zig)

Comentarios
Tuplas y texto
© 2025 Zen of Zig