Документация
Уроки Открыть IDE
На главную
Урок 20

Библиотека types

Как устроены числа «под капотом» — узнаем, чтобы не пугаться C++ и Java

Зачем вообще нужна библиотека types?

Idyllium стремится к логичности и безопасности. Но реальные языки — C++, Java, Rust — не всегда щадят новичков, а при работе с данными иногда дают неочевидные результаты.

Чтобы подготовиться к ним, Idyllium предлагает библиотеку types, которая показывает, как работают числа на машинном уровне "нулей и единиц".

Это не для повседневного использования — это для понимания.

Переполнение: пример с uint8

Например, тип types.uint8 занимает 8 бит и может хранить значения от 0 до 255.

Но что будет, если присвоить более крупное значение?

Такое поведение — не баг Idyllium, а демонстрация того, как работают целочисленные типы в C++ и других системных языках.

Целочисленные типы в types

В библиотеке types доступны знаковые и беззнаковые целочисленные типы.

Знаковые типы (int)

ТипРазмерМинимумМаксимум
int88 бит−128127
int1616 бит−32 76832 767
int3232 бита−2 147 483 6482 147 483 647
int6464 бита−9 223 372 036 854 775 8089 223 372 036 854 775 807

Беззнаковые типы (uint)

ТипРазмерМинимумМаксимум
uint88 бит0255
uint1616 бит065 535
uint3232 бита04 294 967 295
uint6464 бита018 446 744 073 709 551 615

Буква u — от англ. unsigned («беззнаковый»).

Если значение не помещается в диапазон — оно «оборачивается» по правилам модульной арифметики:

Такое поведение идентично тому, что происходит в C++ и других низкоуровневых языках.

Двоичное представление: метод .to_bin()

Любой тип из types умеет превращаться в строку из нулей и единиц:

01001011

Чтобы понять, как десятичные числа превращаются в двоичные, взгляните на результат работы программы:

Десятичное: 0 = двоичное 00000000 Десятичное: 1 = двоичное 00000001 Десятичное: 2 = двоичное 00000010 Десятичное: 3 = двоичное 00000011 Десятичное: 4 = двоичное 00000100 Десятичное: 5 = двоичное 00000101 Десятичное: 6 = двоичное 00000110 Десятичное: 7 = двоичное 00000111 Десятичное: 8 = двоичное 00001000 Десятичное: 9 = двоичное 00001001

Знаковые vs беззнаковые: один и тот же битовый шаблон

Из 8 бит можно составить 256 комбинаций.

Беззнаковый тип использует их все для неотрицательных чисел.

Знаковый — делит пополам: половина для положительных, половина для отрицательных.

Поэтому число -35 в int8 и число 221 в uint8 имеют одинаковое двоичное представление:

11011101 11011101

Создание из двоичной строки: types.from_bin(s, type)

Можно восстановить число из битовой строки — и результат будет зависеть от указанного типа:

163 -93

Один и тот же битовый шаблон — разные числа в зависимости от интерпретации.

Шестнадцатеричное представление: метод .to_hex()

Кроме двоичного, любой целочисленный тип из types может быть представлен в шестнадцатеричной системе с помощью метода .to_hex():

ff

Шестнадцатеричная система удобна для компактного отображения байтов: два символа — один байт.

Создание из шестнадцатеричной строки: types.from_hex(s, type)

Аналогично двоичному, можно восстановить число из шестнадцатеричной строки:

163 -93

Как и в случае с двоичным представлением, один и тот же шестнадцатеричный шаблон может интерпретироваться по-разному в зависимости от типа.

Это особенно полезно при работе с цветами, байтовыми протоколами и отладкой на низком уровне.

Дробные типы: float32 и float64

В types также есть типы с плавающей точкой:

  • float32 — 32 бита (одинарная точность);
  • float64 — 64 бита (двойная точность).

Оба типа хранят приближённые значения — но float64 точнее. Пример:

0.3 в типе float32: 0.300000011920928955078125 0.3 в типе float64: 0.300000000000000044408921

Ни один из типов не хранит 0.3 точно — это фундаментальное ограничение двоичной арифметики. Но float64 ошибается на много порядков меньше.

Двоичное представление float32

В типе float32 32 бита распределены так:

  • 1 бит — знак (0 = положительное, 1 = отрицательное);
  • 8 бит — порядок (экспонента);
  • 23 бита — мантисса (значащие цифры).

Пример с числом -12.5:

11000001010010000000000000000000

Разберём по частям: 1 10000010 10010000000000000000000

Знак 1 → отрицательное число.
Порядок 10000010 = 130 → экспонента = 130 − 127 = 3.
Мантисса 1.1001 → 1.5625.
Итого: −1.5625 × 2³ = −12.5.

Это упрощённая модель стандарта IEEE 754 — именно так большинство языков хранят дробные числа «под капотом».

Итог

Библиотека types — не для написания игр, а для понимания основ:

  • Почему числа «переполняются»;
  • Как устроена память;
  • Почему одни и те же байты могут означать разные числа;
  • Как представляются дробные числа в компьютере.

Это знание делает вас не просто программистом, а инженером.