В предыдущих программах использовались переменные. Поэтому рассмотрим, какие же бывают типы данных для переменных.
С++ — это статически-типизированный язык. Это значит, что для каждой переменной должно быть указано, к какому типу данных она относится. На момент создания переменной мы должны знать, какого она типа данных.
Отсутствие типов в некоторых языках приводит ко многим ошибкам.
У каждого языка есть предопределенные фундаментальные типы данных. Пользователь может расширить их, введя свои понятия.
С++ имеет небольшое количество фундаментальных типов.
- Целочисленные типы int
- Типы с плавающей запятой float, double, long double
- Символьные типы — это по факту целые числа, которые влезают в 1 байт. Но каждому числу поставлен в соответствие какой-то символ. char, wchar_t
- Логический тип bool
- void
- std::nullptr_t
Современные компьютеры не особо умеют оперировать 1 байтом. Системы 32-х битные могут анализировать только сразу 32 битами (4 байта). В 64-х битных системах — 64 битами (8 байтов).
Заметим, что нет типа данных, который отвечает за хранение строки. На самом деле хранение строки можно задать по-разному, поэтому чтобы у программиста была возможность выбрать способ, в языках не предустановлено типа данных для строк.
Модификаторы
- Знаковость signed — целевой тип будет иметь знаковое представление. unsigned — целевой тип будет иметь представление без знака.
- Размер short — целевой тип будет оптимизирован по использованию памяти и будет иметь ширину не менее 16 бит. long — целевой тип будет иметь ширину не менее 32 бит. long long — целевой тип будет иметь ширину не менее 64 бит.
В языках программирование не задано, сколько конкретно памяти занимают переменные определенного типа, но определен их минимальный размер.
Помимо этого С++ гарантирует отношения между размерами типов.
Модели данных
В зависимости от выбранных размеров для типов существуют разные модели данных.
Широко распространены 4:
32-х битные системы:
- LP32 или 2/4/4 (int 2 байта, long 4 байта, указатель 4 байта)
- ILP32 или 4/4/4 (int 4 байта, long 4 байта, указатель 4 байта)
64-х битные системы:
- LLP64 или 4/4/8 (int 4 байта, long 4 байта, указатель 8 байта)
- LP64 или 4/8/8 (int 4 байта, long 8 байта, указатель 8 байта)
Программисту всегда нужно задумываться о том, какой размер нужен для переменных.
Типы данных с плавающей точкой:
- float (4 байта)
- double (8 байт)
- long double (8, 12 или 16 байт)
Существует хранение с фиксированной запятой (например, в банках). Но в основном пользуются плавающей точкой.
GPU оперирует по умолчанию с float. Компьютерная графика.
Центральный процессор — double. Научные работы, численные методы.
Поэтому языки программирования реализуют два типа данных. У них разная точность и разный диапазон.
Представление вещественных чисел
Мы можем использовать двоичное представление чисел, чтобы хранить их в компьютере.
Можно отдать первый бит на хранение знака. Но тогда у нас получится 0 и -0. Сравнивать такие вещественные числа будет опасно. Например, не понятно, равны ли 0 и -0, не понятно, как хранить 1/3.
Поэтому используется другой подход:
Давайте инвертируем число — вместо 0 поставим 1, вместо 1 — 0. А затем добавим единицу.
Будем считать, что такое число является противоположным исходному.
Число с плавающей запятой состоит из набора отдельных двоичных разрядов: знак, порядок, мантисса.
Знак — один бит, указывающий знак всего числа с плавающей точкой.
Порядок и мантисса — целые числа, которые вместе со знаком дают представление числа с плавающей запятой в следующем виде.
-2345е9
2345 — мантисса
9 — порядок
Нормальная форма числа с плавающей точкой запятой. Мантисса находится в полуинтервале [0,1). Однако некоторые числа тогда можно записывать по-разному.
Нормализованная форма числа — мантисса двоичного числа принимает значения от 1 (включительно) до 2 (невключительно).
Эта форма удобна тем, что мы также можем записать +- бесконечность с помощью нее.
Стандарт для представления чисел с плавающей запятой IEEE 754.