Преобразование типов
Иногда в выражении встречаются значения разных типов. Например, целое число делится на дробное или дробное значение записывается в целую переменную. 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 | дробное деление | обычно ожидаемо |
| большое число в маленький тип | значение может не поместиться | неверный результат |
Практика
- Проверьте результат
9 / 4. - Измените одно число на
doubleи снова проверьте деление. - Запишите
double x = 8.75; int y = int(x);и выведитеy. - Посчитайте среднее двух целых чисел так, чтобы результат был дробным.
- Объясните, почему
int(3.9)не даёт4.
Проверьте себя
- Что такое неявное преобразование?
- Что такое явное преобразование?
- Почему
7 / 2даёт3? - Как получить результат
3.5? - Что происходит при записи
doubleвint?
Сначала ответьте без подсказки. Ответ можно считать полным, если вы:
- формулируете основную мысль своими словами;
- называете важные условия, ограничения или меры безопасности;
- для схемы, кода или расчёта показываете ход решения и ожидаемый результат.
Если один из пунктов объяснить не получается, найдите соответствующую главу статьи, перечитайте её и повторите ответ.
Словарь статьи
| Термин | Значение |
|---|---|
| преобразование типа | получение значения одного типа из значения другого типа |
| неявное преобразование | преобразование без отдельной записи в коде |
| явное преобразование | преобразование, указанное программистом |
| целочисленное деление | деление, при котором дробная часть результата отбрасывается |
| потеря данных | ситуация, когда новое значение хранит меньше информации |
Связанные темы
- Переменные и типы данных — основные типы.
- Ввод и вывод — вывод результатов вычислений.
- Функции — возвращаемые типы.
- Битовые операции — работа с отдельными битами целых значений.
Источники
- C++ Working Draft. Conversions: https://eel.is/c++draft/conv
- Microsoft Learn. Standard conversions: https://learn.microsoft.com/en-us/cpp/cpp/standard-conversions