Примитивные типы данных являются основой любого языка программирования, и Zig не исключение. Они предоставляют базовые строительные блоки для работы с числами, символами, булевыми значениями, указателями и другими элементарными данными. Zig, как язык системного программирования, разработанный с упором на производительность и контроль, предоставляет широкий набор примитивных типов, обеспечивая разработчикам гибкость и точность.
В Zig примитивные типы можно разделить на несколько категорий:
-
Числовые типы:
- Целые числа (знаковые и беззнаковые).
- Числа с плавающей запятой.
- Фиксированные размеры чисел.
-
Символьные типы:
- Один символ (кодовая точка Unicode).
-
Логический тип:
- Булевое значение.
-
Указатели и ссылки:
- Прямое управление памятью.
-
Другие встроенные типы:
- Срезы, массивы, массивы фиксированной длины, кортежи.
Целые числа в Zig представлены с фиксированным размером и могут быть знаковыми (iN
) или беззнаковыми (uN
), где N
— размер в битах (например, i8
, u64
).
const std = @import("std");
pub fn main() void {
var a: i32 = -42;
var b: u64 = 123456789;
std.debug.print("a: {}, b: {}\n", .{a, b});
}
- Знаковые:
i8
,i16
,i32
,i64
,i128
. - Беззнаковые:
u8
,u16
,u32
,u64
,u128
.
- Компилятор Zig гарантирует отсутствие переполнений по умолчанию. Если переполнение возможно, оно вызывает ошибку времени выполнения или компиляции.
- Для отключения проверки переполнений можно использовать специальные операции, например
+%
.
Zig поддерживает стандартные типы чисел с плавающей запятой: f16
, f32
, f64
и f128
.
pub fn main() void {
var pi: f64 = 3.141592653589793;
var small: f32 = 0.0001;
std.debug.print("pi: {}, small: {}\n", .{pi, small});
}
- Поддержка арифметики IEEE 754.
- Возможность работы с бесконечностями и
NaN
.
Булевый тип представлен как bool
и может принимать значения true
или false
.
pub fn main() void {
var is_valid: bool = true;
if (is_valid) {
std.debug.print("Данные валидны.\n", .{});
} else {
std.debug.print("Данные не валидны.\n", .{});
}
}
- Используется для условий, циклов и логических операций.
- Размер булевого значения составляет 1 байт.
Zig поддерживает тип u8
для работы с ASCII-символами и u21
для кодовых точек Unicode.
pub fn main() void {
const char: u8 = 'A';
const emoji: u21 = '😊';
std.debug.print("Символ: {}, Emoji: {}\n", .{char, emoji});
}
- Символы — это числовые представления.
- Работа с Unicode требует понимания кодировок.
Указатели (*T
) — важный инструмент в Zig, позволяющий напрямую работать с памятью.
pub fn main() void {
var x: i32 = 42;
var ptr: *i32 = &x;
std.debug.print("Значение через указатель: {}\n", .{ptr.*});
}
- Указатели могут быть безопасными или небезопасными (в зависимости от контекста).
- Zig поддерживает
null
-указатели, но требует явной проверки.
Срезы ([]T
) позволяют работать с массивами без создания копий.
pub fn main() void {
var array: [5]u32 = [5]u32{10, 20, 30, 40, 50};
const slice = array[1..4];
for (slice) |value| {
std.debug.print("{}\n", .{value});
}
}
- Срезы сохраняют ссылку на оригинальные данные.
- Используются для работы с массивами переменной длины.
Zig поддерживает типы, определённые на месте, такие как кортежи и структуры.
pub fn main() void {
const tuple = .{42, "hello", true};
std.debug.print("Число: {}, Строка: {}, Булево: {}\n", .{tuple.0, tuple.1, tuple.2});
}
const std = @import("std");
pub fn main() void {
const point = struct {
x: i32,
y: i32,
}{ .x = 10, .y = 20 };
std.debug.print("Point: ({}, {})\n", .{point.x, point.y});
}
В Zig примитивные типы тесно связаны с управлением памятью. Выделение и освобождение памяти осуществляется вручную через аллокаторы, что позволяет избегать утечек памяти.
const std = @import("std");
pub fn main() !void {
const allocator = std.heap.page_allocator;
var buffer = try allocator.alloc(u8, 10);
defer allocator.free(buffer);
for (buffer) |*value, index| {
value.* = @as(u8, index);
}
std.debug.print("Массив: {}\n", .{buffer});
}
Константы в Zig объявляются с использованием ключевого слова const
. Они могут быть вычислены на этапе компиляции, что позволяет оптимизировать код.
const PI: f64 = 3.141592653589793;
const RADIUS: u32 = 5;
const AREA: f64 = @mul(@pow(PI, 2), @as(f64, RADIUS));
pub fn main() void {
std.debug.print("Площадь круга: {}\n", .{AREA});
}
Примитивные типы в Zig — это мощный инструмент, который сочетается с низкоуровневым управлением памятью и производительностью. Разработчики получают точный контроль над размерами, представлением и поведением данных, что делает Zig идеальным для системного программирования и задач, требующих высокой эффективности.