Данные и представление¶
Краткий справочник по тому, что такое данные, как они кодируются в системах счисления, представляются в памяти машины и хранятся как текст.
1. Данные: понятие, виды, типы (примитивные/составные; числовые, строковые, логические; типы данных в Python)¶
Данные — это представление фактов, понятий или инструкций в формализованном виде, пригодном для обработки. По структуре типы делят на примитивные (неделимые: число, символ, логическое значение) и составные (контейнеры из других значений: список, словарь, кортеж). По смыслу выделяют числовые, строковые и логические типы.
Базовые типы в Python:
| Тип | Категория | Пример |
|---|---|---|
int, float, complex |
числовой, примитивный | 42, 3.14 |
str |
строковый, составной (последовательность) | "hello" |
bool |
логический, примитивный (подтип int) |
True, False |
list, tuple, dict, set |
составной | [1, 2], {"a": 1} |
bytes |
бинарный, составной | b"\x00" |
2. Системы счисления (двоичная, восьмеричная, десятичная, шестнадцатеричная; перевод; запись в Python 0b, 0o, 0x)¶
Система счисления определяется основанием — числом используемых цифр: двоичная (2), восьмеричная (8), десятичная (10), шестнадцатеричная (16, цифры 0–9 и A–F). Перевод из позиционной системы в десятичную — сумма цифр на степени основания; обратно — деление с остатком. Шестнадцатеричная удобна тем, что одна цифра кодирует ровно 4 бита (полубайт).
В Python целые литералы записываются с префиксами: 0b1010 (двоичный), 0o17 (восьмеричный), 0x1F (шестнадцатеричный). Функции bin(), oct(), hex() дают строковое представление, а int("1F", 16) — обратный разбор.
| Десятичное | Двоичное | Восьмеричное | Шестнадцатеричное |
|---|---|---|---|
| 10 | 0b1010 |
0o12 |
0xA |
| 255 | 0b11111111 |
0o377 |
0xFF |
3. Машинное представление чисел (целые в дополнительном коде, переполнение; вещественные — стандарт IEEE 754, мантисса/экспонента, проблемы точности float)¶
Целые числа со знаком хранятся в дополнительном коде (two's complement): старший бит — знаковый, отрицательные числа получают инверсией битов и прибавлением единицы. Это даёт единое представление нуля и единообразное сложение, но в типах фиксированной ширины приводит к переполнению — при выходе за диапазон значение «заворачивается» (в Python int неограничен и не переполняется, но C-типы и numpy — да).
Вещественные числа кодируются по стандарту IEEE 754: число раскладывается на знак, экспоненту и мантиссу (\(\pm m \times 2^{e}\)). Из-за конечной мантиссы многие десятичные дроби непредставимы точно — отсюда классическое 0.1 + 0.2 == 0.30000000000000004. Для денег и точных расчётов используют decimal.Decimal или fractions.Fraction.
4. Кодировки символов (ANSI/однобайтовые, Unicode как набор кодовых точек, UTF-8 как переменная длина; str vs bytes в Python)¶
Однобайтовые кодировки (ASCII, семейство «ANSI» вроде CP1251, ISO-8859) отводят на символ один байт и вмещают максимум 256 символов — этого не хватает для всех языков. Unicode — это не кодировка, а единый каталог: каждому символу сопоставлена кодовая точка (например, U+0041 — буква A). UTF-8 — способ закодировать кодовые точки байтами переменной длины (1–4 байта); ASCII-символы остаются однобайтовыми, что обеспечивает совместимость.
В Python str — это последовательность кодовых точек Unicode (текст), а bytes — последовательность байтов (двоичные данные). Переход между ними всегда явный: text.encode("utf-8") даёт bytes, data.decode("utf-8") возвращает str.