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

3.2   Базовые типы данных

Когда мы говорим о данных в компьютере, нам приходят на ум текст, изображения, видео, звук, 3D-модели и многие другие формы. Хотя эти данные организованы по-разному, все они состоят из различных базовых типов данных.

Базовые типы данных - это типы, с которыми CPU может работать напрямую; в алгоритмах они используются непосредственно и в основном включают следующее.

  • Целочисленные типы 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}\)

Обрати внимание: приведенная выше таблица относится именно к базовым типам данных 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)]
// Инициализируем массивы с использованием разных базовых типов данных
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

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