Приведение типов в C: явное и неявное преобразование
Преобразование значения одного типа в другой называется приведением типов (type casting) или преобразованием типов (type conversion). Например, чтобы сохранить значение типа long в переменную int, нужно явно привести тип.
Явное приведение выполняется оператором приведения (cast operator):
(type_name) expression
Пример: деление с получением дробного результата
#include <stdio.h>
int main() {
int sum = 17, count = 5;
double mean;
mean = (double) sum / count;
printf("Value of mean : %f\n", mean);
return 0;
}
Результат:
Value of mean : 3.400000
Оператор приведения имеет высший приоритет, поэтому sum сначала преобразуется в double, а затем происходит деление с плавающей точкой.
Преобразования бывают:
- неявные (implicit) — компилятор выполняет их автоматически;
- явные (explicit) — программист указывает их через оператор приведения.
Хорошей практикой считается использовать явное приведение там, где преобразование необходимо — это делает код понятнее и предсказуемее.
Целочисленное продвижение (Integer Promotion)
Целочисленные типы, «меньшие» int или unsigned int (char, short, _Bool, битовые поля), автоматически повышаются до int или unsigned int в выражениях.
Пример: сложение char и int:
#include <stdio.h>
int main() {
int i = 17;
char c = 'c'; // ASCII 99
int sum = i + c;
printf("Value of sum : %d\n", sum);
return 0;
}
Результат:
Value of sum : 116
c неявно преобразовался в int (значение 99) перед сложением.
Обычные арифметические преобразования (Usual Arithmetic Conversions)
Когда операнды бинарного оператора имеют разные типы, компилятор неявно приводит их к общему типу. Алгоритм:
- Сначала выполняется целочисленное продвижение.
- Если типы всё ещё отличаются, операнды приводятся к типу, стоящему выше в иерархии:
long double
double
float
unsigned long long
long long
unsigned long
long
unsigned int
int
Исключения: эти преобразования не применяются к операторам присваивания (=, += и т.д.) и логическим операторам &&, ||.
Пример: смешанная арифметика с float
#include <stdio.h>
int main() {
int i = 17;
char c = 'c'; // 99
float sum = i + c;
printf("Value of sum : %f\n", sum);
return 0;
}
Результат:
Value of sum : 116.000000
Сначала c → int (продвижение), затем i и результат → float (обычное арифметическое преобразование), так как целевая переменная — float.
Язык C
- Освоение преобразования типов в C#: неявное, явное, Parse и Convert
- Мастерство преобразования типов в Python: Полное руководство
- Освоение приведения типов в Java: от расширения к сужению и далее
- Типы переменных в C++: память, ограничения и операции
- Типы данных в C#: типы значений, ссылочные типы и указатели
- Преобразование типов в C#: неявное и явное приведение
- Nullable-типы в C#: безопасная работа со значениями null
- Атрибуты в C#: метаданные, предопределённые и пользовательские атрибуты
- Литье под давлением (Die Casting): точность, эффективность и производственные преимущества
- Полное руководство по точному литью: технологии и применение