Перейти к основному содержимому

Преобразование типов

Значение переходит из одного типа в другой

Иногда в выражении встречаются значения разных типов. Например, целое число делится на дробное или дробное значение записывается в целую переменную. C++ может выполнить преобразование сам или по явной просьбе программиста.

Коротко

Неявное преобразование происходит автоматически. Явное преобразование записывается в коде. Самая частая ошибка новичка — ждать дробный результат от деления двух int.

Неявное преобразование

#include <iostream>
using namespace std;

int main() {
int a = 5;
double b = a;

cout << b << endl;
return 0;
}

Значение 5 из int можно безопасно записать в double. Компилятор делает это автоматически.

Целочисленное деление

#include <iostream>
using namespace std;

int main() {
int a = 7;
int b = 2;

cout << a / b << endl;
return 0;
}

Вывод:

3

Оба числа имеют тип int, поэтому результат тоже целый. Дробная часть отбрасывается.

Чтобы получить дробный результат, хотя бы одно значение должно быть дробным:

#include <iostream>
using namespace std;

int main() {
double a = 7;
int b = 2;

cout << a / b << endl;
return 0;
}

Вывод:

3.5

Явное преобразование

Иногда программист специально просит изменить тип значения:

#include <iostream>
using namespace std;

int main() {
int sum = 7;
int count = 2;

double avg = double(sum) / count;
cout << avg << endl;
return 0;
}

Запись double(sum) делает дробным левое число до деления. В этом разделе используем такую простую форму. Более строгие формы преобразования изучают позже.

Целое деление и дробное деление дают разные результаты

Потеря дробной части

#include <iostream>
using namespace std;

int main() {
double x = 3.9;
int y = int(x);

cout << y << endl;
return 0;
}

Вывод:

3

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

Таблица частых случаев

СитуацияЧто происходитРиск
int в doubleзначение становится дробным типомобычно безопасно
double в intдробная часть отбрасываетсяпотеря данных
int / intцелочисленное делениенеожиданно нет дроби
double / intдробное делениеобычно ожидаемо
большое число в маленький типзначение может не поместитьсяневерный результат

Практика

  1. Проверьте результат 9 / 4.
  2. Измените одно число на double и снова проверьте деление.
  3. Запишите double x = 8.75; int y = int(x); и выведите y.
  4. Посчитайте среднее двух целых чисел так, чтобы результат был дробным.
  5. Объясните, почему int(3.9) не даёт 4.

Проверьте себя

  1. Что такое неявное преобразование?
  2. Что такое явное преобразование?
  3. Почему 7 / 2 даёт 3?
  4. Как получить результат 3.5?
  5. Что происходит при записи double в int?
Ориентиры для самопроверки

Сначала ответьте без подсказки. Ответ можно считать полным, если вы:

  • формулируете основную мысль своими словами;
  • называете важные условия, ограничения или меры безопасности;
  • для схемы, кода или расчёта показываете ход решения и ожидаемый результат.

Если один из пунктов объяснить не получается, найдите соответствующую главу статьи, перечитайте её и повторите ответ.

Словарь статьи

ТерминЗначение
преобразование типаполучение значения одного типа из значения другого типа
неявное преобразованиепреобразование без отдельной записи в коде
явное преобразованиепреобразование, указанное программистом
целочисленное делениеделение, при котором дробная часть результата отбрасывается
потеря данныхситуация, когда новое значение хранит меньше информации

Связанные темы

Источники