Числовые типы и арифметика
У школьного счётчика два десятичных колёсика. После 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-коуча.
Оплата пока не подключена: премиум и курсы открываются промокодом.