Ранее рассматривался только один тип целочисленных переменных — 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 бит | -215 =- 32768 | 215-1 = 32767 |
unsigned short |
16 бит | 0 | 216-1 = 65535 |
int , long |
32 бита | -231 = -2147483648 | 231-1 = 2147483647 |
unsigned , unsigned long |
32 бита | 0 | 232-1 = 4294967295 |
long long |
64 бита | -263 = -9223372036854775808 | 263-1 = 9223372036854775807 |
unsigned long long |
64 бита | 0 | 264-1 = 18446744073709551615 |
На самом деле в стандарте языка C++ не оговорены конкретные значения размеров типов. Оговорено только то, что одинаковые знаковые и беззнаковые типы имеют одинаковые размеры, и размер меньшего типа всегда не превосходит размера большего типа. Вот какие размеры могут быть у этих типов в зависимости от разрядности процессора компьютера:
Тип | 16-битный процессор | 32-битный процессор | 64-битный процессор |
---|---|---|---|
short |
2 байта | 2 байта | 2 байта |
int |
2 байта | 4 байта | 4 байта |
long |
4 байта | 4 байта | 8 байт |
long long |
— | 8 байт | 8 байт |
Действительные (вещественные) числа представляются в виде чисел с десятичной точкой (а не запятой, как принято при записи десятичный дробей в русский текстах). Для записи очень больших или очень маленьких по модулю чисел используется так называемая запись “с плавающей точкой” (также называемая “научная” запись). В этом случае число представляется в виде некоторой десятичной дроби, называемой мантиссой, умноженной на целочисленную степень десяти (порядок). Например, расстояние от Земли до Солнца равно 1.496·1011, а масса молекулы воды 2.99·10-23.
Числа с плавающей точкой в программах на языке 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
и требуется вычислить их частное (не целочисленное) и записать в переменную d
типа double
. Следующий код:
double d; d = a / b
будет неверным, т.к. деление a / b
будет целочисленным. Правильный код такой:
double d; d = (double)a / b;
В этом примере используется операция приведения типа: (double)a
. Эта операция
возвращает значение типа double
, но равное значению переменной a
.
В результате деление будет выполняться, как деление вещественных чисел, поскольку будет
выполняться деление действительного значения на целочисленное.
Операция приведения типа не меняет тип самой переменной и ее значение, а только возвращает значение другого типа.
Определите, чему будут равны следующие переменные
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>
Функция от одного аргумента вызывается, например, так: sin(x)
. Вместо числа x
может быть любое число, переменная или выражение. Функция возращает значение, которое можно вывести на экран, присвоить
другой переменной или использовать в выражении:
y = sin(x); cout << sqrt(2) << endl;
Функция | Описание |
---|---|
Округление | |
round |
Округляет число по правилам арифметики, то есть round(1.5) == 2 , round(-1.5) == -2 |
floor |
Округляет число вниз (“пол”), при этом floor(1.5) == 1 , floor(-1.5) == -2 |
ceil |
Округляет число вверх (“потолок”), при этом ceil(1.5) == 2 , ceil(-1.5) == -1 |
trunc |
Округление в сторону нуля (отбрасывание дробной части), при этом trunc(1.5) == 1 , trunc(-1.5) == -1 |
fabs |
Модуль (абсолютная величина) |
Корни, степени, логарифмы | |
sqrt |
Квадратный корень. Использование: sqrt(x) |
cbrt |
Кубический корень. Использование: cbrt(x) |
pow |
Возведение в степень, возвращает ab. Использование: pow(a,b) |
exp |
Экспонента, возвращает ex. Использование: exp(x) |
log |
Натуральный логарифм |
log10 |
Десятичный логарифм |
Тригонометрия | sin |
Синус угла, задаваемого в радианах |
cos |
Косинус угла, задаваемого в радианах |
tan |
Тангенс угла, задаваемого в радианах |
asin |
Арксинус, возвращает значение в радианах |
acos |
Арккосинус, возвращает значение в радианах |
atan |
Арктангенс, возвращает значение в радианах |
Также в файле cmath
есть набор полезных числовых констант, например, константа M_PI
хранит значение числа \(\pi\).
В компиляторе Visual C++ для использования этих констант
необходимо объявить директиву препроцессора _USE_MATH_DEFINES
перед
подключения заголовочного файла cmath
.
#define _USE_MATH_DEFINES #include <cmath>
По умолчанию действительные числа выводятся с точностью в 6 знаков, но в переменной типа double
числа храняться с точностью в 15-16 знаков. Для того, чтобы вывести число с большей точностью,
например, с точностью в 15 знаков, нужно выполнить команду:
cout.precision(15);