Перейти к содержанию
Приглашаем вас участвовать в развитии русской версии! Подробнее здесь.

# 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` и т.д.

Python C++Java C#Go Swift JS TS Dart Rust C Kotlin Ruby

    # Инициализируем массивы с использованием различных базовых типов данных
    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)]

    // Инициализируем массивы с использованием различных базовых типов данных
    int numbers[5];
    float decimals[5];
    char characters[5];
    bool bools[5];

    // Инициализируем массивы с использованием различных базовых типов данных
    int[] numbers = new int[5];
    float[] decimals = new float[5];
    char[] characters = new char[5];
    boolean[] bools = new boolean[5];

    // Инициализируем массивы с использованием различных базовых типов данных
    int[] numbers = new int[5];
    float[] decimals = new float[5];
    char[] characters = new char[5];
    bool[] bools = new bool[5];

    // Инициализируем массивы с использованием различных базовых типов данных
    var numbers = [5]int{}
    var decimals = [5]float64{}
    var characters = [5]byte{}
    var bools = [5]bool{}

    // Инициализируем массивы с использованием различных базовых типов данных
    let numbers = Array(repeating: 0, count: 5)
    let decimals = Array(repeating: 0.0, count: 5)
    let characters: [Character] = Array(repeating: "a", count: 5)
    let bools = Array(repeating: false, count: 5)

    // Массивы JavaScript могут свободно хранить различные базовые типы данных и объекты
    const array = [0, 0.0, 'a', false];

    // Инициализируем массивы с использованием различных базовых типов данных
    const numbers: number[] = [];
    const characters: string[] = [];
    const bools: boolean[] = [];

    // Инициализируем массивы с использованием различных базовых типов данных
    List<int> numbers = List.filled(5, 0);
    List<double> decimals = List.filled(5, 0.0);
    List<String> characters = List.filled(5, 'a');
    List<bool> bools = List.filled(5, false);

    // Инициализируем массивы с использованием различных базовых типов данных
    let numbers: Vec<i32> = vec![0; 5];
    let decimals: Vec<f32> = vec![0.0; 5];
    let characters: Vec<char> = vec!['0'; 5];
    let bools: Vec<bool> = vec![false; 5];

    // Инициализируем массивы с использованием различных базовых типов данных
    int numbers[10];
    float decimals[10];
    char characters[10];
    bool bools[10];

    // Инициализируем массивы с использованием различных базовых типов данных
    val numbers = IntArray(5)
    val decinals = FloatArray(5)
    val characters = CharArray(5)
    val bools = BooleanArray(5)

    # Списки Ruby могут свободно хранить различные базовые типы данных и ссылки на объекты
    data = [0, 0.0, 'a', false, ListNode(0)]

Визуализация выполнения

https://pythontutor.com/render.html#code=class%20ListNode%3A%0A%20%20%20%20%22%22%22%D1%81%D0%B2%D1%8F%D0%B7%D0%BD%D1%8B%D0%B9%20%D1%81%D0%BF%D0%B8%D1%81%D0%BE%D0%BA%D1%83%D0%B7%D0%B5%D0%BB%D0%BA%D0%BB%D0%B0%D1%81%D1%81%22%22%22%0A%20%20%20%20def%20__init__%28self%2C%20val%3A%20int%29%3A%0A%20%20%20%20%20%20%20%20self.val%3A%20int%20%3D%20val%20%20%23%20%D0%97%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B5%20%D1%83%D0%B7%D0%BB%D0%B0%0A%20%20%20%20%20%20%20%20self.next%3A%20ListNode%20%7C%20None%20%3D%20None%20%20%23%20%D0%A1%D1%81%D1%8B%D0%BB%D0%BA%D0%B0%20%D0%BD%D0%B0%20%D1%81%D0%BB%D0%B5%D0%B4%D1%83%D1%8E%D1%89%D0%B8%D0%B9%20%D1%83%D0%B7%D0%B5%D0%BB%0A%0A%22%22%22Driver%20Code%22%22%22%0Aif%20__name__%20%3D%3D%20%22__main__%22%3A%0A%20%20%20%20%23%20%D0%98%D0%BD%D0%B8%D1%86%D0%B8%D0%B0%D0%BB%D0%B8%D0%B7%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D1%82%D1%8C%20%D0%BC%D0%B0%D1%81%D1%81%D0%B8%D0%B2%20%D1%81%20%D0%B8%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%D0%BC%20%D0%BD%D0%B5%D1%81%D0%BA%D0%BE%D0%BB%D1%8C%D0%BA%D0%B8%D1%85%20%D0%B1%D0%B0%D0%B7%D0%BE%D0%B2%D1%8B%D1%85%20%D1%82%D0%B8%D0%BF%D0%BE%D0%B2%20%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85%0A%20%20%20%20numbers%20%3D%20%5B0%5D%20%2A%205%0A%20%20%20%20decimals%20%3D%20%5B0.0%5D%20%2A%205%0A%20%20%20%20%23%20%D0%92%20Python%20%D1%81%D0%B8%D0%BC%D0%B2%D0%BE%D0%BB%D1%8B%20%D0%BD%D0%B0%20%D1%81%D0%B0%D0%BC%D0%BE%D0%BC%20%D0%B4%D0%B5%D0%BB%D0%B5%20%D1%8F%D0%B2%D0%BB%D1%8F%D1%8E%D1%82%D1%81%D1%8F%20%D1%81%D1%82%D1%80%D0%BE%D0%BA%D0%B0%D0%BC%D0%B8%20%D0%B4%D0%BB%D0%B8%D0%BD%D1%8B%201%0A%20%20%20%20characters%20%3D%20%5B%270%27%5D%20%2A%205%0A%20%20%20%20bools%20%3D%20%5BFalse%5D%20%2A%205%0A%20%20%20%20%23%20%D0%A1%D0%BF%D0%B8%D1%81%D0%BA%D0%B8%20%D0%B2%20Python%20%D0%BC%D0%BE%D0%B3%D1%83%D1%82%20%D1%81%D0%B2%D0%BE%D0%B1%D0%BE%D0%B4%D0%BD%D0%BE%20%D1%85%D1%80%D0%B0%D0%BD%D0%B8%D1%82%D1%8C%20%D1%80%D0%B0%D0%B7%D0%BB%D0%B8%D1%87%D0%BD%D1%8B%D0%B5%20%D0%B1%D0%B0%D0%B7%D0%BE%D0%B2%D1%8B%D0%B5%20%D1%82%D0%B8%D0%BF%D1%8B%20%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85%20%D0%B8%20%D1%81%D1%81%D1%8B%D0%BB%D0%BA%D0%B8%20%D0%BD%D0%B0%20%D0%BE%D0%B1%D1%8A%D0%B5%D0%BA%D1%82%D1%8B%0A%20%20%20%20data%20%3D%20%5B0%2C%200.0%2C%20%27a%27%2C%20False%2C%20ListNode%280%29%5D&cumulative=false&curInstr=12&heapPrimitives=nevernest&mode=display&origin=opt-frontend.js&py=311&rawInputLstJSON=%5B%5D&textReferences=false

##### Оставляйте свои идеи, вопросы и предложения в комментариях