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
|
1
|
2
|
3
|
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) |