Перейти к содержанию

Данные и представление

Краткий справочник по тому, что такое данные, как они кодируются в системах счисления, представляются в памяти машины и хранятся как текст.

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.

См. также