Перевод этой страницы?:

Типы данных C++

Программисты на C++ могут использовать пять типов данных из C: void, int, float, double и char.

ТипОписание
voidне соответствует никакому типу
intцелый
floatвещественный очень малой точности
doubleвещественный двойной точности
charсимвольный

Кроме того в C++ есть типы: bool и wchar_t.

ТипОписание
boolлогический, true (истина) или false (ложь)
wchar_tрасширенный символьный (должен поддерживать все представимые в системе символы)

Модификаторы типа

Некоторые из перечисленных типов можно модифицировать ключевыми словами signed (знаковый), unsigned (беззнаковый), short (короткий) и long (длинный). Если тип не указывается, то подразумевается тип int. Полный набор возможных типов с модификаторами показан ниже (одинаковые типы записаны в одной строке):

целочисленные типы
bool
char
signed char
unsigned char
wchar_t
shortshort intsigned shortsigned short int
unsigned shortunsigned short int
intsignedsigned int
unsignedunsigned int
longlong intsigned longsigned long int
unsigned longunsigned long int
вещественные типы
float
double
long double
частично поддерживаемые целочисленные типы
long longlong long intsigned long longsigned long long int
unsigned long longunsigned long long int

Размеры и диапазоны типов

Размеры и диапазоны значений типов зависят от используемого процессора и компилятора. Заголовочный файл «cfloat» (или «float.h») содержит характеристики для вещественных типов, а «climits» (или «limits.h») - для целочисленных типов. Вы можете использовать операцию sizeof для определения размера любого типа (в байтах). Однако для большинства архитектур эти размеры совпадают: int и float обычно 32 бита, char - 8 бит, а double - 64 бита; для хранения bool используется 1 бит, long long - 64 бита.

Ограничения для числовых типов определены в заголовочном файле <limits>. Методы и константы шаблонного класса numeric_limits описаны ниже. Специализация этого класса может быть определена для любого пользовательского типа данных.

Метод или
константа
Тип результатаОписание
is_specializedbool
radixintоснование показателя степени
digitsintколичество (двоичных) цифр в мантиссе
digits10intколичество десятичных цифр в мантиссе
is_signedboolчисло со знаком?
is_integerboolцелое?
is_exactboolточное?
min()<тип>нормализованное минимальное значение (для вещественных положительное)
max()<тип>наибольшее значение
epsilon()<тип>точность, такое что 1 + epsilon > 1
round_error()<тип>ошибка округления
infinity()<тип>бесконечность
quiet_NaN()<тип>неверное число, не сигнализирующее об ошибке
signaling_NaN()<тип>неверное число, сигнализирующее об ошибке
denorm_min()<тип>ненормализованное минимальное значение
min_exponentintминимальная (двоичная) экспонента
min_exponent10intминимальная десятичная экспонента
max_exponentintмаксимальная (двоичная) экспонента
max_exponent10intмаксимальная десятичная экспонента
has_infinityboolесть бесконечность?
has_quiet_NaNbool
has_signaling_NaNbool
has_denorm<тип>_denorm_style
has_denorm_lossbool
is_iec559boolсоответствует IEC-559?
is_boundedboolограничен?
is_moduloboolпо модулю?
trapsbool
tinyness_beforebool
round_stylefloat_round_style
{ round_to_nearest, … }
тип округления

В основном используется для проверки границ, определения максимальных и минимальных значений, которые может содержать данный тип. Код ниже печатает минимум и максимум типа short для конкретного компьютера.

  #include <limits>
  std::cout << "Maximum short value: " << std::numeric_limits<short>::max() << std::endl;
  std::cout << "Minimum short value: " << std::numeric_limits<short>::min() << std::endl;

Как читать объявление типа

Объявление с простым типом несложно понять:

  int i

Но как понять эти более сложные объявления:

  double **d[8]              // хмм...
  char *(*(**foo [][8])())[] // черт! что такое foo?

Чтобы понять эти объявления используйте следующие три правила:

  1. Начинайте с имени переменной (d или foo в примерах выше)
  2. Заканчивайте на имени типа (double или char выше)
  3. Идите вправо пока можно, затем влево (влево необходимо идти при обнаружении закрывающейся скобки).

Например:

ВыражениеЗначение
double **d[8];
double **d[8]; d это … double
double **d[8]; d это массив из 8 … double
double **d[8]; d это массив из 8 указателей на … double
double **d[8]; d это массив из 8 указателей на указатель на double

Второй пример:

ВыражениеЗначение
char *(*(**foo [][8])())[]
char *(*(**foo [][8])())[] foo это … char
char *(*(**foo [][8])())[] foo это массив из … char
char *(*(**foo [][8])())[] foo это массив из массивов из 8 … char
char *(*(**foo [][8])())[] foo это массив из массивов из 8 указателей на … char
char *(*(**foo [][8])())[] foo это массив из массивов из 8 указателей на указатель на
… char
char *(*(**foo [][8])())[] foo это массив из массивов из 8 указателей на указатель на
функцию, возвращающую … char
char *(*(**foo [][8])())[] foo это массив из массивов из 8 указателей на указатель на
функцию, возвращающую указатель на … char
char *(*(**foo [][8])())[] foo это массив из массивов из 8 указателей на указатель на
функцию, возвращающую указатель на массив из … char
char *(*(**foo [][8])())[] foo это массив из массивов из 8 указателей на указатель на
функцию, возвращающую указатель на массив из указателей на char

Другие примеры можно посмотреть в прекрасном руководстве Steve Friedl о чтении объявлений на C: http://www.unixwiz.net/techtips/reading-cdecl.html.