3.2 Базовые типы данных¶
Когда речь заходит о данных в компьютере, мы в первую очередь вспоминаем текст, изображения, видео, звук, 3D-модели и многие другие формы представления информации. Хотя способы организации этих данных различаются, все они строятся из базовых типов данных.
Базовые типы данных - это типы, которые процессор может обрабатывать непосредственно. В алгоритмах они используются напрямую и в основном включают следующее.
- Целочисленные типы
byte,short,int,long. - Типы с плавающей точкой
float,double, используемые для представления дробных чисел. - Символьный тип
char, используемый для представления букв, знаков препинания и даже эмодзи в разных языках. - Логический тип
bool, используемый для представления суждений «да» и «нет».
Базовые типы данных хранятся в компьютере в двоичной форме. Один двоичный разряд равен \(1\) биту. В большинстве современных операционных систем \(1\) байт (byte) состоит из \(8\) битов (bit).
Диапазон значений базовых типов данных зависит от объема занимаемого ими пространства. Ниже в качестве примера используется Java.
- Целочисленный тип
byteзанимает \(1\) байт = \(8\) бит и может представлять \(2^{8}\) чисел. - Целочисленный тип
intзанимает \(4\) байта = \(32\) бита и может представлять \(2^{32}\) чисел.
В таблице 3-1 перечислены объем памяти, диапазон значений и значения по умолчанию для различных базовых типов данных в Java. Эту таблицу не нужно заучивать наизусть. Достаточно иметь общее представление и при необходимости обращаться к ней.
Таблица 3-1 Объем памяти и диапазоны значений базовых типов данных
| Тип | Обозначение | Объем памяти | Минимальное значение | Максимальное значение | Значение по умолчанию |
|---|---|---|---|---|---|
| Целые | byte |
1 байт | \(-2^7\) (\(-128\)) | \(2^7 - 1\) (\(127\)) | \(0\) |
short |
2 байта | \(-2^{15}\) | \(2^{15} - 1\) | \(0\) | |
int |
4 байта | \(-2^{31}\) | \(2^{31} - 1\) | \(0\) | |
long |
8 байт | \(-2^{63}\) | \(2^{63} - 1\) | \(0\) | |
| Вещественные | float |
4 байта | \(1.175 \times 10^{-38}\) | \(3.403 \times 10^{38}\) | \(0.0\text{f}\) |
double |
8 байт | \(2.225 \times 10^{-308}\) | \(1.798 \times 10^{308}\) | \(0.0\) | |
| Символы | char |
2 байта | \(0\) | \(2^{16} - 1\) | \(0\) |
| Логические | bool |
1 байт | \(\text{false}\) | \(\text{true}\) | \(\text{false}\) |
Обрати внимание: в таблице 3-1 приведены данные именно для базовых типов данных Java. В каждом языке программирования свои определения типов, поэтому объем памяти, диапазон значений и значения по умолчанию могут различаться.
- В Python целочисленный тип
intможет иметь произвольный размер, ограниченный только доступной памятью. Типfloatявляется 64-битным числом двойной точности. Типаcharнет, а отдельный символ на деле является строкойstrдлины 1. - В C и C++ размер базовых типов данных явно не зафиксирован и зависит от реализации и платформы. В таблице 3-1 приведены данные для модели LP64 data model, используемой в 64-битных Unix-системах, включая Linux и macOS.
- Размер символа
charв C и C++ составляет 1 байт, а в большинстве других языков программирования зависит от конкретного способа кодирования символов. Подробнее это рассматривается в разделе «Кодирование символов». - Хотя для представления логического значения достаточно 1 бита ( \(0\) или \(1\) ), в памяти оно обычно хранится как 1 байт. Это связано с тем, что современные CPU обычно используют 1 байт как минимальную адресуемую единицу памяти.
Какова же связь между базовыми типами данных и структурами данных? Мы знаем, что структура данных - это способ организации и хранения данных в компьютере. Подлежащее в этой фразе - «структура», а не «данные».
Если мы хотим представить «ряд чисел», то естественно подумаем об использовании массива. Это связано с тем, что линейная структура массива может выразить отношения соседства и порядка между числами, а то, что именно хранится внутри - целые int , вещественные float или символы char , - к «структуре данных» отношения не имеет.
Иными словами, базовые типы данных задают «тип содержимого» данных, а структуры данных задают «способ организации» данных. Например, в следующем коде мы используем одну и ту же структуру данных (массив) для хранения и представления различных базовых типов данных, включая int , float , char , bool и т.д.
# Инициализируем массивы с использованием различных базовых типов данных
numbers: list[int] = [0] * 5
decimals: list[float] = [0.0] * 5
# В Python символы фактически являются строками длины 1
characters: list[str] = ['0'] * 5
bools: list[bool] = [False] * 5
# Списки Python могут свободно хранить различные базовые типы данных и ссылки на объекты
data = [0, 0.0, 'a', False, ListNode(0)]