Арифметические операции
Таблица 4.1. Арифметические операции
Символ операции |
Значение |
Использование |
* |
Умножение |
expr * expr |
/ |
Деление |
expr / expr |
% |
Остаток от деления |
expr % expr |
+ |
Сложение |
expr + expr |
- |
Вычитание |
expr – expr |
Деление целых чисел дает в результате целое число. Дробная часть результата, если она есть, отбрасывается:
int ivall = 21 / 6; |
int iva12 = 21 / 7;
И ival1, и ival2 в итоге получат значение 3.
Операция остаток (%), называемая также делением по модулю, возвращает остаток от деления первого операнда на второй, но применяется только к операндам целого типа (char, short, int, long). Результат положителен, если оба операнда положительны. Если же один или оба операнда отрицательны, результат зависит от реализации, то есть машинно-зависим. Вот примеры правильного и неправильного использования деления по модулю:
3.14 % 3; // ошибка: операнд типа double 21 % 6; // правильно: 3 21 % 7; // правильно: 0 21 % -5; // машинно-зависимо: -1 или 1
int iva1 = 1024; double dval = 3.14159;
iva1 % 12; // правильно: |
iva1 % dval; // ошибка: операнд типа double
Иногда результат вычисления арифметического выражения может быть неправильным либо не определенным. В этих случаях говорят об арифметических исключениях (хотя они не вызывают возбуждения исключения в программе). Арифметические исключения могут иметь чисто математическую природу (скажем, деление на 0) или происходить от представления чисел в компьютере – как переполнение
(когда значение превышает величину, которая может быть выражена объектом данного типа). Например, тип char
содержит 8 бит и способен хранить значения от 0 до 255
либо от -128 до 127 в зависимости от того, знаковый он или беззнаковый. В следующем примере попытка присвоить объекту типа char значение 256
вызывает переполнение:
#include <iostream>
int main() { char byte_value = 32; int ival = 8;
// переполнение памяти, отведенной под byte_value byte_value = ival * byte_value;
cout << "byte_value: " <<static_cast<int>(byte_value) << endl; |