Для хранения и обработки данных в языках высокого уровня используются переменные, основной характеристикой которых является используемый тип данных. Знание базовых типов и умение грамотно их выбирать является обязательным условием для написания качественной программы.
Под типом данных понимается множество допустимых значений этих данных и множество разрешённых операций над ними. Тип данных определяет также размер памяти, выделяемый под объект такого типа.
Выделяют базовые и производные типы. Базовые типы данных являются стандартными, они входят в описание языка и имеют имена, являющиеся ключевыми словами. Производные типы задаются самим программистом на основе базовых типов.
В C++ существуют следующие базовые типы данных:
- Пустой тип – void;
- Логический тип – bool;
- Символьные типы – char, wchar_t;
- Целочисленные типы – short, int, long;
- Вещественные типы – float, double, long double.
Одна из основных характеристик любого типа – диапазон допустимых значений, который определяется размером памяти, выделяемым под этот тип. Эти размеры не заданы жёстко в стандарте C++ и могут варьироваться в зависимости от компилятора, процессора и операционной системы.
Размер любого типа в языке C++ выражается в единицах размера типа char, т.е. размер char по определению равен 1. Гарантируется, что для типа char используется минимум 8 бит, для short – не менее 16, для int – по меньшей мере 32.
Также гарантируется следующее:
1 = char ≤ short ≤ int ≤ long
1 ≤ bool ≤ long
char ≤ wchar_t ≤ long
float ≤ double ≤ long double
N = signed N = unsigned N
Типичные размеры основных типов для 32-разрядной архитектуры для компилятора MS Visual Studio 2005 приведены в таблице 1.
Таблица 1. Размер и диапазон значений для основных типов данных языка C++
Тип
Диапазон значений
Размер
байт
Бит
bool
true, false (1,0)
signed char (char)
-128 .. 127
unsigned char
0 .. 255
wchar_t
0 .. 65535
signed short int (short, short int, signed short)
-32768 .. 32767
unsigned short int (unsigned short)
0 .. 65535
signed int (int, signed)
-2147483648 .. 2147483647
unsigned int (unsigned)
0 .. 4294967295
signed long int (long, long int, signed long)
-2147483648 .. 2147483647
unsigned long int (unsigned long)
0 .. 4294967295
float
1.175e-38 .. 3.402e+38
double
2.225e-308 .. 1.797e+308
long double
2.225e-308 .. 1.797e+308
void *
0 .. 4294967295
Как видно из таблицы, к целым типам могут применяться модификаторы signed и unsigned, означающие наличие и отсутствие знака у числа соответственно.
Хотя в таблице есть типы, абсолютно одинаковые с точки зрения размера выделяемой памяти (int и long, double и long double), нужно всегда помнить, что это размеры типов для конкретного компилятора, работающего в конкретной операционной системе на конкретной аппаратной платформе. Поэтому нужно всегда иметь в виду неравенства, гарантированные стандартом С++, которые приведены перед таблицей. Необдуманное использование типов данных, на первый взгляд равнозначных, может создать проблемы при переходе на другой компилятор / тип процессора / операционную систему.