Ранее рассматривался только один тип целочисленных переменных — int. На самом деле существует несколько основных целочисленных типов, тип int — лишь один (но наиболее часто используемый) из них.
| Название | Размер | Знаковый | Синонимы |
|---|---|---|---|
| short | 2 байта | Знаковый | short int, signed short, signed short int |
| unsigned short | 2 байта | Беззнаковый | unsigned short int |
| int | 4 байта | Знаковый | signed int |
| unsigned | 4 байта | Беззнаковый | unsigned int |
| long | 4 байта | Знаковый | long int, signed long, signed long int |
| unsigned long | 4 байта | Беззнаковый | unsigned long int |
| long long | 8 байт | Знаковый | long long int, signed long long, signed long long int |
| unsigned long long | 8 байт | Беззнаковый | unsigned long long int |
То есть типы бывают “короткими” (short), обычными, длинными (long) и очень длинными (long long). Последний тип является расширением компилятора GNU C++ и не являлся стандартным типом для языка C++, поэтому в старых реализациях он мог называться по-другому (например, в Microsoft Visual C++ аналогичный тип называется int64). Чем “длиннее” тип, тем большее количество различных значений он может принимать и тем больше памяти он занимает.
Также типы бывают знаковыми (signed), которые могут принимать как положительные, так и отрицательные значения, и беззнаковыми (unsigned), которые принимают только неотрицательные значения.
| Название | Размер | Минимальное значение | Максимальное значение |
|---|---|---|---|
| short | 16 бит | -2¹⁵ = -32768 | 2¹⁵−1 = 32767 |
| unsigned short | 16 бит | 0 | 2¹⁶−1 = 65535 |
| int, long | 32 бита | -2³¹ = -2147483648 | 2³¹−1 = 2147483647 |
| unsigned, unsigned long | 32 бита | 0 | 2³²−1 = 4294967295 |
| long long | 64 бита | -2⁶³ = -9223372036854775808 | 2⁶³−1 = 9223372036854775807 |
| unsigned long long | 64 бита | 0 | 2⁶⁴−1 = 18446744073709551615 |
На самом деле в стандарте языка C++ не указаны конкретные размеры типов. Определено только то, что одинаковые знаковые и беззнаковые типы имеют одинаковый размер, и что размер меньшего типа не превосходит большего. Вот какие размеры могут быть у типов в зависимости от разрядности процессора:
| Тип | 16-битный процессор | 32-битный процессор | 64-битный процессор |
|---|---|---|---|
| short | 2 байта | 2 байта | 2 байта |
| int | 2 байта | 4 байта | 4 байта |
| long | 4 байта | 4 байта | 8 байт |
| long long | — | 8 байт | 8 байт |
Действительные (вещественные) числа представляются в виде чисел с десятичной точкой (а не запятой, как в русском тексте). Для записи очень больших или очень маленьких чисел используется запись “с плавающей точкой” (научная запись). В этом случае число представляется как десятичная дробь (мантисса), умноженная на степень десяти (порядок).
Например, расстояние от Земли до Солнца равно 1.496·10¹¹, а масса молекулы воды — 2.99·10⁻²³.
В программах на C++ такие числа записываются через букву e: 1.496e11 и 2.99e-23. Перед числом может стоять знак минус. Пробелы внутри не ставятся.
| Тип | Точность | Размер | Количество знаков мантиссы | Минимальное положительное значение | Максимальное значение |
|---|---|---|---|---|---|
| float | Одинарная | 4 байта | 7 | 1.4e-45 | 3.4e38 |
| double | Двойная | 8 байт | 15 | 5.0e-324 | 1.7e308 |
| long double | Расширенная | 10 байт | 19 | 1.9e-4951 | 1.1e4932 |
Для действительных чисел определены операции сложения, вычитания, умножения и деления.
Однако операция деления выполняется по-разному для целых и вещественных типов. Если оба операнда целые, выполняется деление нацело с отбрасыванием дробной части. Если хотя бы один операнд — вещественный, выполняется обычное деление, и результат — вещественное число.
cout << 10 / 3 << endl;
cout << 10. / 3 << endl;
cout << 10 / 3. << endl;
cout << 10. / 3. << endl;
Этот код выведет 3 в первой строке и 3.33333 в остальных.
Результат деления не зависит от типа переменной, которой он присваивается. Например:
double a = 10 / 3;
переменная a будет равна 3, потому что 10 / 3 — это целочисленное деление.
Иногда требуется явно привести выражение одного типа к другому. Например, если есть две переменные a и b типа int и нужно вычислить их частное как вещественное:
double d;
d = a / b;
Такой код будет неверным, потому что a / b — это целочисленное деление. Правильный вариант:
double d;
d = (double)a / b;
Здесь используется операция приведения типа. Она возвращает значение другого типа, не изменяя саму переменную. После приведения деление выполняется как вещественное.
Определите, чему будут равны следующие переменные:
int a = 13 / 5;
int b = 13 % 5;
int c = 13.0 / 5;
double d = 13 / 5;
double e = 13 % 5;
double f = 13.0 / 5;
double g = 13 / 5 + 2 / 5;
double h = 13.0 / 5 + 2.0 / 5;
int i = 13.0 / 5 + 2.0 / 5;
В стандартную библиотеку C++ входит множество математических функций. Чтобы использовать их, нужно подключить заголовочный файл:
#include <cmath>
Функция от одного аргумента вызывается, например, так:
y = sin(x);
cout << sqrt(2) << endl;
round(x) — округляет по правилам арифметики (round(1.5)==2, round(-1.5)==-2).floor(x) — округление вниз (“пол”).ceil(x) — округление вверх (“потолок”).trunc(x) — округление в сторону нуля.fabs(x) — модуль (абсолютная величина).sqrt(x) — квадратный корень.cbrt(x) — кубический корень.pow(a,b) — возведение в степень.exp(x) — экспонента (ex).log(x) — натуральный логарифм.log10(x) — десятичный логарифм.sin(x) — синус угла в радианах.cos(x) — косинус.tan(x) — тангенс.asin(x), acos(x), atan(x) — обратные функции (аргумент и результат в радианах).Также в <cmath> есть полезные числовые константы, например M_PI — число π. В Visual C++ для их использования нужно добавить:
#define _USE_MATH_DEFINES
#include <cmath>
По умолчанию действительные числа выводятся с 6 знаками после запятой. Но переменные типа double хранят числа с точностью до 15–16 знаков. Чтобы изменить точность вывода, используйте:
cout.precision(15);