Библиотека types
Как устроены числа «под капотом» — узнаем, чтобы не пугаться C++ и Java
Зачем вообще нужна библиотека types?
Idyllium стремится к логичности и безопасности. Но реальные языки — C++, Java, Rust — не всегда щадят новичков, а при работе с данными иногда дают неочевидные результаты.
Чтобы подготовиться к ним, Idyllium предлагает библиотеку types, которая показывает, как работают числа на машинном уровне "нулей и единиц".
Это не для повседневного использования — это для понимания.
Переполнение: пример с uint8
Например, тип types.uint8 занимает 8 бит и может хранить значения от 0 до 255.
Но что будет, если присвоить более крупное значение?
Такое поведение — не баг Idyllium, а демонстрация того, как работают целочисленные типы в C++ и других системных языках.
Целочисленные типы в types
В библиотеке types доступны знаковые и беззнаковые целочисленные типы.
Знаковые типы (int)
| Тип | Размер | Минимум | Максимум |
|---|---|---|---|
int8 | 8 бит | −128 | 127 |
int16 | 16 бит | −32 768 | 32 767 |
int32 | 32 бита | −2 147 483 648 | 2 147 483 647 |
int64 | 64 бита | −9 223 372 036 854 775 808 | 9 223 372 036 854 775 807 |
Беззнаковые типы (uint)
| Тип | Размер | Минимум | Максимум |
|---|---|---|---|
uint8 | 8 бит | 0 | 255 |
uint16 | 16 бит | 0 | 65 535 |
uint32 | 32 бита | 0 | 4 294 967 295 |
uint64 | 64 бита | 0 | 18 446 744 073 709 551 615 |
Буква u — от англ. unsigned («беззнаковый»).
Если значение не помещается в диапазон — оно «оборачивается» по правилам модульной арифметики:
Такое поведение идентично тому, что происходит в C++ и других низкоуровневых языках.
Двоичное представление: метод .to_bin()
Любой тип из types умеет превращаться в строку из нулей и единиц:
Чтобы понять, как десятичные числа превращаются в двоичные, взгляните на результат работы программы:
Знаковые vs беззнаковые: один и тот же битовый шаблон
Из 8 бит можно составить 256 комбинаций.
Беззнаковый тип использует их все для неотрицательных чисел.
Знаковый — делит пополам: половина для положительных, половина для отрицательных.
Поэтому число -35 в int8 и число 221 в uint8 имеют одинаковое двоичное представление:
Создание из двоичной строки: types.from_bin(s, type)
Можно восстановить число из битовой строки — и результат будет зависеть от указанного типа:
Один и тот же битовый шаблон — разные числа в зависимости от интерпретации.
Шестнадцатеричное представление: метод .to_hex()
Кроме двоичного, любой целочисленный тип из types может быть представлен в шестнадцатеричной системе с помощью метода .to_hex():
Шестнадцатеричная система удобна для компактного отображения байтов: два символа — один байт.
Создание из шестнадцатеричной строки: types.from_hex(s, type)
Аналогично двоичному, можно восстановить число из шестнадцатеричной строки:
Как и в случае с двоичным представлением, один и тот же шестнадцатеричный шаблон может интерпретироваться по-разному в зависимости от типа.
Это особенно полезно при работе с цветами, байтовыми протоколами и отладкой на низком уровне.
Дробные типы: float32 и float64
В types также есть типы с плавающей точкой:
float32— 32 бита (одинарная точность);float64— 64 бита (двойная точность).
Оба типа хранят приближённые значения — но float64 точнее. Пример:
Ни один из типов не хранит 0.3 точно — это фундаментальное ограничение двоичной арифметики. Но float64 ошибается на много порядков меньше.
Двоичное представление float32
В типе float32 32 бита распределены так:
- 1 бит — знак (
0= положительное,1= отрицательное); - 8 бит — порядок (экспонента);
- 23 бита — мантисса (значащие цифры).
Пример с числом -12.5:
Разберём по частям: 1 10000010 10010000000000000000000
Знак 1 → отрицательное число.
Порядок 10000010 = 130 → экспонента = 130 − 127 = 3.
Мантисса 1.1001 → 1.5625.
Итого: −1.5625 × 2³ = −12.5.
Это упрощённая модель стандарта IEEE 754 — именно так большинство языков хранят дробные числа «под капотом».
Итог
Библиотека types — не для написания игр, а для понимания основ:
- Почему числа «переполняются»;
- Как устроена память;
- Почему одни и те же байты могут означать разные числа;
- Как представляются дробные числа в компьютере.
Это знание делает вас не просто программистом, а инженером.