§ 2. Организация вычислений

2.3. Целочисленный тип данных

Часто при решении задач нужно работать с целыми числами. Для этого в C++ используется тип данных int.

С помощью переменных типа можно задавать целые числа из диапазона от –2147483648 до 2147483647. Для этого типа данных определены следующие операции:

Математические операции

Запись в С++

+ (сложение) +
– (вычитание)
∙ (умножение) *
целочисленное деление /
нахождение остатка %

В С++ для деления как целых, так и вещественных чисел используется один и тот же знак «/». Будет результат целым или вещественным, зависит от операндов (переменных или чисел, стоящих слева и справа от знака). Если хотя бы один операнд вещественный, то результат будет вещественным. Если оба операнда целые, то и результат будет целым.

Операция «%» соответствует операции mod в языке программирования Pascal и используется только для целых чисел.

Пример 2.6. Даны два целых числа и b. Написать программу, которая находит целую часть и остаток от деления a на b.

Этапы выполнения задания

I. Исходные данные: переменные a и b.

II. Результат: переменные c (целочисленное частное) и d (остаток).

III. Алгоритм решения задачи.

1. Ввод исходных данных. 
2. Целочисленное частное находим как результат операции: a/b, остаток — a%b.
3. Вывод результата.

IV. Описание переменных: a, b, c, d  int.

Значение, которое выдает в качестве результата операция %, может отличаться от математического определения остатка (в математике под остатком понимают неотрицательное число). Если остаток не равен нулю, то знак числа, которое является результатом операции %, определяется знаками операндов (пример 2.7). Если проанализировать данные из таблицы, то можно понять, что begin mathsize 16px style a space percent sign space b space equals space a space minus space open square brackets a over b close square brackets space cross times space b end style [1].

При выполнении арифметических операций следует помнить, что сначала операция выполняется в соответствии с типами операндов, а затем происходит преобразование полученного типа к типу результата. Например, пусть в программе записана команда:

double = 16 / 7;

Вначале будет выполнено деление 16 на 7 (целочисленное), в результате получим 2. После чего целое значение 2 будет преобразовано к вещественному значению 2.0. Чтобы получить вещественный результат, необходимо, чтобы хотя бы одно число было вещественным. Команду можно записать, например, так:

double x = 16. / 7;

Если в операторе присваивания используются не константы, а переменные, то необходимо преобразовать выражение так, чтобы действия выполнялись с нужным типом. Например, оператор присваивания

double x = a / b;

в котором a и b целочисленные переменные, можно записать так:

double x = 1. */ b;

Тогда результат операции умножения будет вещественным и деление будет выполняться для вещественных чисел.


[1] Скобки open square brackets blank close square brackets  обозначают округление числа до целого в меньшую сторону.

 

Тип int является базовым целочисленным типом. Другие целочисленные типы можно получать, приписывая к int модификаторы. Различают два типа модификаторов, которые могут менять знаковость или размер.

Знаковость:

signed — тип будет иметь знаковое представление (используется по умолчанию, если модификатор не указан);

unsigned — тип будет иметь беззнаковое представление.

Размер:

short — тип будет занимать в памяти не меньше 16 бит;

long — тип будет иметь размер не меньше 32 бит;

long long — тип будет иметь размер не меньше 64 бит.

Примеры использования модификаторов:

Тип

Диапазон значений

Размер (бит)

short int 32768..32767 16
unsigned short int 0..65535 16
int 2147483648.. 2147483647 32
unsigned int 0..4294967295 32
long long int  263 .. 263  1 64
unsigned long long int 0 .. 264  1 64

Если при описании используют модификаторы, то слово int может быть опущено. Следующие описания эквивалентны:

short int short
unsigned int unsigned
long long int long long
unsigned long long int unsigned long long

Пример 2.6.  

V. Программа:

#include <iostream>

using namespace std;

int main()

{

  int a, b;

  cout << "Vvedi 2 chisla" << endl;

  cin >> a >> b;

  int c = a / b;

  int d = a % b;

  cout << "a / b = " << c << endl;

  cout << "a % b = " << d << endl;

  return 0;

}

IV. Тестирование программы:

Запустите программу и введите значения a = 11 и b = 4.

Результат должен быть следующим:

Пример 2.7.  Результат операций div и mod для разных чисел:

a

b

a / b

a % b

17 3 5 2
–17 3 –5 –2
17 –3 –5 2
–17 –3 5 –2

В языке С++ допускается явное преобразование типов. Для этого используется команда

 static_cast<dataType>(value

Здесь — dataType имя типа, к которому нужно преобразовать величину value.

В коде программы эта команда используется следующим образом:

  double static_cast<double>(a)/b 

Также компилятором С++ поддерживается так называемый Cи-стиль приведения типов данных, когда новый тип указывается в скобках перед именем переменной:

    double x = (double)/ b;    

Компилятор C++ также позволяет использовать этот оператор и следующим образом:

    double = double(a) / b;  

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