Курс языка программирования Raku / Продвинутый уровень / Подробнее о встроенных типах / Нативные типы

Типы с фиксированным размером и переполнение

Помимо обычного int, в Raku есть целочисленные типы фиксированной разрядности: int8, int16, int32, int64 и их беззнаковые аналоги uint8, uint16, uint32, uint64. Число в имени обозначает, сколько бит занимает значение.

Фиксированная разрядность означает фиксированный диапазон. int8 хранит значения от -128 до 127; uint8 — от 0 до 255. Поскольку размер хранилища не может увеличиваться, выход за верхнюю границу приводит к «обороту» к нижней — это переполнение:

my int8 $i = 127;
$i++;
say $i; # -128

Прибавление единицы к наибольшему значению int8 не даёт 128 (которое не поместилось бы); вместо этого происходит переход к наименьшему значению, -128. Беззнаковые типы также переполняются:

my uint8 $u = 255;
$u++;
say $u; # 0

Это противоположность обычного Int, который просто увеличивается настолько, насколько нужно, и никогда не переполняется. Компромисс — это и есть суть типов фиксированного размера: вы принимаете ограниченный диапазон в обмен на предсказуемое, компактное и быстрое хранение.

Используйте нативный тип фиксированного размера, когда вы знаете диапазон ваших данных и хотите повысить эффективность — например, для байтов двоичных данных в массиве uint8. Для обычной арифметики, где числа могут расти без ограничений, используйте Int.

Практика

Пройдите 1 тест по содержанию этой темы.

Навигация по курсу

Тест — Нативные типы   |   Тест — Переполнение


💪 Или перейдите сразу к упражнениям этого раздела.