Тип данных — это правило, которое говорит программе, что лежит в переменной и что с этим можно делать. Число 5 можно умножить, строку «5» можно только склеить с другой строкой, а True отвечает на вопрос «да или нет». Тип задаёт три вещи: какие значения допустимы, какие операции с ними работают и сколько места они занимают в памяти.
Почти в любом языке есть одинаковый базовый набор: целые числа, дробные числа, строки и логический тип. Поверх них строятся составные типы: массивы, словари, объекты. Ниже разбираю каждый на примерах кода на Python, JavaScript и C, которые я запускал перед публикацией. Если вы только начинаете, сначала загляните в основы программирования: там восемь понятий, без которых типы читаются тяжело.
Зачем нужны типы данных

Компьютер хранит всё в виде нулей и единиц. Одна и та же последовательность битов может быть числом, буквой или цветом пикселя. Тип объясняет программе, как эти биты читать.
Разница видна на простом примере. Сложим два числа и две строки в Python:
print(5 + 3)
print("5" + "3")
8
53
Знак + один, а результат разный, потому что у значений разные типы. Для чисел плюс означает сложение, для строк он склеивает текст.
Зачем это нужно на практике:
- Защищают от бессмыслицы. Язык не даст разделить имя пользователя на дату рождения.
- Экономят память. Флаг «оплачено или нет» не должен занимать столько же места, сколько длинный текст.
- Ускоряют код. Когда компилятор заранее знает тип, он выбирает быстрые машинные команды.
Тип всегда привязан к значению, а иногда и к имени, в котором значение хранится. Как устроены имена и присваивание, подробно разобрано в статье что такое переменная в программировании.
Основные типы данных: шпаргалка
Названия в языках отличаются, но смысл совпадает. Вот как базовые типы называются в четырёх популярных языках:
| Что хранит | Пример | Python | JavaScript | Java | C |
|---|---|---|---|---|---|
| Целое число | 42 |
int | number, bigint | byte, short, int, long | char, short, int, long |
| Дробное число | 3.14 |
float | number | float, double | float, double |
| Строка | "кот" |
str | string | String | массив char |
| Один символ | 'к' |
нет, строка длины 1 | нет, строка длины 1 | char | char |
| Логическое значение | true |
bool | boolean | boolean | _Bool (с C99), bool (с C23) |
| «Пусто» | нет значения | None | null, undefined | null | NULL для указателей |
| Набор значений | [1, 2, 3] |
list, tuple | Array | массив, ArrayList | массив |
| Пары «ключ: значение» | {"имя": "Аня"} |
dict | Object, Map | HashMap | struct |
Когда спрашивают про «4 типа данных», обычно имеют в виду школьную классификацию из информатики: целый, вещественный, логический и символьный (строковый). Все четыре есть в таблице выше: целое и дробное число, логическое значение и строка с символом.
Все типы делят на две большие группы:
- Простые (примитивные) хранят одно неделимое значение: число, символ, true или false.
- Составные собирают несколько значений в одну структуру: массив, словарь, объект.
Проверить тип в Python можно функцией type():
print(type(42), type(3.14), type("кот"), type(True), type(None))
print(type([1, 2]), type({"имя": "Аня"}))
<class 'int'> <class 'float'> <class 'str'> <class 'bool'> <class 'NoneType'>
<class 'list'> <class 'dict'>
Канал основателя Checkroi Вани Буявца3 800 человек читают мой Телеграм-канал про нейросетиСобрал промпты для Claude Code и ChatGPT, разборы ИИ-инструментов и лайфхаки по продвижению бизнеса в одном местеПрисоединитьсяЧисла: целые и дробные
Чисел в программировании два вида, и путать их опасно. Целые считают штуки: товары в корзине, номер строки, возраст. Дробные нужны для измерений: вес, температура, координаты.
Целые числа: int
Integer, или int, хранит целое число без дробной части. В большинстве языков у него есть предел. В Java int занимает 32 бита и вмещает числа от −231 до 231−1, а для больших значений есть long на 64 бита, это прописано в документации Oracle.
В C размер int зависит от платформы. Стандарт гарантирует только минимум в 16 бит, большинство современных систем дают 32, пишет cppreference. Что бывает, когда число не влезает, видно на беззнаковом типе на 1 байт:
#include <stdio.h>
int main(void) {
printf("char: %zu, int: %zu, long long: %zu, double: %zu\n",
sizeof(char), sizeof(int), sizeof(long long), sizeof(double));
unsigned char level = 255;
level = level + 1;
printf("255 + 1 = %d\n", level);
return 0;
}
char: 1, int: 4, long long: 8, double: 8
255 + 1 = 0
Размеры в байтах получены на Mac с процессором arm64. Переменная дошла до максимума 255 и после прибавления единицы обнулилась. Это называется переполнение, и компилятор о нём не предупредит.
Python устроен иначе: его int растёт сколько нужно. В документации Python так и написано: у целых чисел неограниченная точность.
print(2 ** 100)
1267650600228229401496703205376
Дробные числа: float и double
Float хранит число с плавающей запятой. В Java float занимает 32 бита, double 64, оба по стандарту IEEE 754, это есть в той же документации Oracle. Тип number в JavaScript устроен как double в Java, пишет MDN. Float в Python на практически любом компьютере тоже 64-битный.
Float хранит число приблизительно. Десятичная дробь 0,1 в двоичной системе бесконечна, поэтому её округляют:
print(0.1 + 0.2)
print(0.1 + 0.2 == 0.3)
0.30000000000000004
False
JavaScript выдаёт тот же 0.30000000000000004. Так устроен сам формат, подробности есть в учебнике Python про арифметику с плавающей точкой.
Для денег float не подходит. В Python берут модуль decimal, в базах данных тип numeric. Документация PostgreSQL прямо рекомендует его для денежных сумм.
from decimal import Decimal
print(Decimal("0.1") + Decimal("0.2"))
0.3
Float появляется и там, где его не ждали. Обычное деление через / и квадратный корень в Python возвращают дробное число, даже если ответ целый:
import math
print(10 / 5, math.sqrt(16))
2.0 4.0
Если дальше это число пойдёт в индекс списка или в range(), его придётся явно перевести в int. Другие способы извлечь корень и какой тип возвращает каждый, собраны в статье про корень в Python.
Чем int отличается от float
| int | float | |
|---|---|---|
| Что хранит | Целые числа | Числа с дробной частью |
| Точность | Точная, пока число в пределах типа | Приблизительная, у 64-битного надёжны около 15 знаков |
| Для чего | Счётчики, индексы, количество | Измерения, физика, графика |
| Деньги | Подходит, если хранить копейки | Не подходит |
Ещё они по-разному делятся. В C деление двух целых отбрасывает дробную часть:
int a = 7, b = 2;
printf("7 / 2 = %d\n", a / b);
printf("7.0 / 2 = %.1f\n", 7.0 / b);
7 / 2 = 3
7.0 / 2 = 3.5
В Python оператор / всегда возвращает float, а целочисленное деление делают через //: 7 / 2 даёт 3.5, 7 // 2 даёт 3.
Сравнивать два float через == рискованно по той же причине, что и с 0.1 + 0.2. Чем отличаются операторы сравнения и где новички ошибаются с !=, разобрано в статье не равно в Python.
Строки, символы и логический тип
Строка: string
Строка хранит последовательность символов: имя, адрес, текст сообщения. В кавычках число превращается в строку, поэтому "42" и 42 относятся к разным типам.
Для русского текста есть подвох: длина строки в символах и в байтах не совпадает. В кодировке UTF-8 латинская буква занимает 1 байт, а кириллическая 2, это следует из спецификации RFC 3629.
s = "Привет"
print(len(s), len(s.encode("utf-8")))
print(len("Hello"), len("Hello".encode("utf-8")))
6 12
5 5
Шесть букв, но двенадцать байтов. Если поле в базе ограничено байтами, кириллическое имя упрётся в лимит вдвое раньше латинского.
Символ: char
Отдельный тип для одного символа есть в C и Java. В C char занимает 1 байт, в Java 16 бит, и он хранит символ Unicode. В Python и JavaScript такого типа нет: один символ там просто строка длиной 1.
Логический тип: boolean
Логический тип хранит только два значения: истину и ложь. Он нужен в условиях и проверках: оплачен ли заказ, вошёл ли пользователь. Подробно про него рассказано в статье что такое boolean.
В Python bool технически подвид int, поэтому с ним можно считать:
print(True + True, isinstance(True, int))
2 True
Составные типы: массивы, словари и объекты

Составной тип хранит сразу много значений. Основные виды:
- Массив или список: упорядоченный набор, к элементу обращаются по номеру. Чем массив отличается от списка, разобрано в статье что такое массив, а методы списков описаны в материале про списки в Python.
- Словарь (в JavaScript его роль играет объект) хранит пары «ключ: значение»:
{"имя": "Аня", "возраст": 25}. - Множество: набор без повторов, удобно убирать дубли. Примеры есть в статье про множества в Python.
- Структура или класс: свой тип из нескольких полей, например «Пользователь» с именем, почтой и датой регистрации.
Значение и ссылка
С составными типами есть ловушка. Переменная со списком хранит ссылку на него, а сам список лежит в памяти отдельно. Присвоили список второй переменной и получили второе имя для того же объекта:
cart = ["хлеб", "молоко"]
copy = cart
copy.append("сыр")
print(cart)
safe = cart.copy()
safe.append("чай")
print(cart)
['хлеб', 'молоко', 'сыр']
['хлеб', 'молоко', 'сыр']
Сыр появился в исходной корзине, хотя добавляли его в copy. А вот чай после .copy() в неё не попал. Со строками и числами такого не случится: в документации Python они названы неизменяемыми, в отличие от списков и словарей.
Пустое значение: null, None, undefined
Отдельный случай, значение «ничего». В Python это None, в Java null, в JavaScript сразу два: undefined (значение не задали) и null (задали пустоту намеренно).
let x;
console.log(typeof x, typeof null);
undefined object
typeof null возвращает "object". Так повелось с первой реализации языка: исправление предлагали, но его отклонили, пишет MDN. Всего в JavaScript восемь типов: семь примитивных и Object, полный список есть в справочнике MDN по типам и структурам данных.
Типизация: статическая и динамическая, сильная и слабая
Типизацией называют правила, по которым язык следит за типами. Простыми словами, она отвечает на два вопроса: когда проверяется тип и разрешает ли язык смешивать разные типы. Все виды типизации с примерами языков подробно разобраны в отдельной статье про типизацию в программировании.
- Статическая: тип известен до запуска, ошибку покажет компилятор. Так работают Java, C, C#, Go.
- Динамическая: тип выясняется во время работы программы. Так работают Python и JavaScript.
- Сильная (строгая): язык не смешивает типы молча и требует явного преобразования.
- Слабая: язык сам приводит типы друг к другу, иногда неожиданно.
Оси независимы, поэтому языки раскладываются по таблице:
| Сильная | Слабая | |
|---|---|---|
| Статическая | Java, C#, Go | C |
| Динамическая | Python, Ruby | JavaScript, PHP |
Строгую динамическую типизацию Python и слабую у JavaScript видно на одной операции. JavaScript склеивает строку с числом, а при вычитании превращает строку в число:
console.log("5" + 3);
console.log("5" - 3);
53
2
Python на ту же операцию отвечает ошибкой:
print("5" + 3)
TypeError: can only concatenate str (not "int") to str
Ещё есть деление на явную и неявную типизацию: пишете ли вы тип руками (int age = 25 в Java) или язык выводит его сам (age = 25 в Python). Для JavaScript есть надстройка TypeScript, которая добавляет статические типы, их базовый набор описан в справочнике TypeScript. Как типизация выглядит на переменных, разобрано в статье про синтаксис Python.
Как узнать тип и преобразовать его
Данные из формы, файла или API почти всегда приходят строкой. Прежде чем считать, их переводят в число. Основные команды:
| Задача | Python | JavaScript |
|---|---|---|
| Узнать тип | type(x), isinstance(x, int) |
typeof x |
| Строка → целое | int("42") |
Number("42"), parseInt("42") |
| Строка → дробное | float("3.5") |
Number("3.5") |
| Число → строка | str(10) |
String(10) |
Проверка на живом коде:
print(int("42") + 1, float("3.5"), str(10) + " лет")
43 3.5 10 лет
Если строку нельзя прочитать как число, Python бросит исключение, а JavaScript вернёт NaN:
int("3.5")
# ValueError: invalid literal for int() with base 10: '3.5'
console.log(Number("abc"));
// NaN
Чтобы программа не падала на кривом вводе, преобразование оборачивают в обработку ошибок. Как это сделать, показано в статье try except в Python.
Частые ошибки с типами данных

- Деньги во float. Копейки теряются при сложении тысяч операций. Решение:
Decimalв Python,numericв базе или целое число копеек. - Сравнение дробных через ==.
0.1 + 0.2 == 0.3даётFalse. Решение: сравнивать с допуском, в Python для этого естьmath.isclose(). - Строка вместо числа. Сумма «10» и «5» из формы превращается в «105». Решение: приводить ввод к числу сразу после получения.
- Целочисленное деление. В C и Java
7 / 2даёт 3, и среднее значение молча округляется. Решение: сделать хотя бы один операнд дробным. - Переполнение. Счётчик в маленьком типе доходит до максимума и обнуляется или уходит в минус. Решение: брать тип с запасом, например
longвместоintдля идентификаторов. - Общий список на две переменные. Правка через одно имя меняет данные под другим. Решение: делать копию через
.copy()или срез.
Где освоить программирование системно
Типы данных проходят в начале почти любого курса, но запоминаются они только на практике: когда сами ловите TypeError и разбираетесь, откуда взялся лишний ноль после запятой. Курсы ниже начинают с основ и дают задачи с проверкой кода.
| Курс | Школа | Стоимость со скидкой | В рассрочку | Длительность | Обзор курса от Checkroi |
|---|---|---|---|---|---|
| Алгоритмы и структуры данных Перейти на сайт курса | 78 840 ₽ | 2190 ₽/мес. | 5 месяцев | Обзор курса | |
| Алгоритмы и структуры данных. Базовый курс Перейти на сайт курса | 15 000 ₽ | 417 ₽/мес. | 1 месяц | Обзор курса | |
| Алгоритмы и структуры данных на Python. Базовый курс Перейти на сайт курса | 15 000 ₽ | 417 ₽/мес. | 1 месяц | Обзор курса | |
| Алгоритмы и циклы Перейти на сайт курса | 4200 ₽ | 2690 ₽/мес. | Обзор курса | ||
| Информатика и вычислительная техника Перейти на сайт курса | 32 900 ₽ | 2633 ₽/мес. | 512 часов | Обзор курса |
Больше программ — в полном каталоге курсов по основам программирования
Если уже понятно, с какого языка начинать, посмотрите курсы по Python или весь каталог курсов программирования. Если не определились, начните с разбора первой программы на Python: там видно, как типы работают в настоящей задаче.




