Раздел 41 · Zig с нуля

Числовые типы и арифметика

junior~10 мин

без входаВойди, чтобы отмечать прогресс, вести заметки и решать задачи в редакторе. войти

Числовые типы и арифметика

У школьного счётчика два десятичных колёсика. После 99 нельзя показать 100, не добавив третье. Можно остановиться на 99, вернуться к 00 или сообщить о переполнении. Само устройство не знает, какой вариант нужен твоей задаче. Числовой тип в программе тоже задаёт вместимость, а смысл на границе выбираешь ты.

Сегодня не будем зубрить таблицу типов. На одном маленьком счётчике разберём диапазон, знак и способы сложения.

Одна мысль урока

Тип задаёт диапазон числа, а оператор определяет поведение на границе.

Опора из прошлого урока: Переменные: const и var.

От картинки к записи

u8 означает целое без знака из восьми двоичных разрядов. Оно хранит значения от 0 до 255. i8 использует те же восемь разрядов для диапазона от -128 до 127. Буква отвечает за знак, число за количество разрядов. Zig разрешает и необычные ширины, например u4; такой тип удобно показывает границу на маленьком примере.

Переполнение

не означает, что процессор перестал работать. Оно означает, что представление больше не вмещает математический результат. У u4 максимум 15: сумма 14 и 3 равна 17, а места для 17 нет. Нельзя переносить привычки бесконечной арифметики на ограниченный тип.

Обычное + требует, чтобы результат помещался. В Debug и ReleaseSafe нарушение проверяется. На известных при компиляции значениях ошибка может обнаружиться ещё до запуска. В ReleaseFast нельзя рассчитывать, что неподдерживаемое переполнение вдруг приобретёт нужный смысл. Если нужен круговой счётчик, оператор +% явно задаёт сложение с оборачиванием. Если нужна остановка на максимуме, +| явно задаёт насыщение.

Насыщение

подходит, например, для яркости пикселя. Если к максимальной яркости прибавить ещё, не хочется получить тёмный пиксель. Оборачивание подходит иной задаче: номеру позиции в круговом счётчике. Выбор оператора идёт от смысла, не от желания убрать сообщение компилятора.

Для количества элементов обычно используют usize, беззнаковый тип ширины адреса целевой машины. На 64-битной цели его ширина 64 бита, на 32-битной 32. Это не обещание бесконечного количества памяти, только подходящий тип для размеров и индексов. Стоимость товара и температуру необязательно хранить в usize.

Числа с дробной частью представлены типами f32 и f64. Они используют конечное двоичное приближение, поэтому многие десятичные дроби не представлены точно. Для первого знакомства достаточно помнить: вычисление с дробью и сравнение целого не всегда проверяются одним способом. Встроенные тесты позже покажут проверку приблизительного равенства.

Преобразование в широкий тип делай до арифметики, если именно ширина должна вместить результат. Присваивание суммы двух u8 в u16 после переполнения не восстанавливает потерянную информацию. Сначала расширь хотя бы один операнд, затем вычисляй. Типы управляют действиями, а не только подписью готового ответа.

премиум-урок

Продолжение в премиуме: 1 200 ₽ в месяц или 10 000 ₽ в год. Вместе с ним серверные проверки задач и школьные токены AI-коуча.

Оплата пока не подключена: премиум и курсы открываются промокодом.