-
Notifications
You must be signed in to change notification settings - Fork 0
Операция приведения типа
Данные разных типов представляются (хранятся) в компьютере разным способом.
Например, числовое значение, соответствующее смыслу математической записи 1 хранится разным способом, в зависимости от того, значение ли это типа int, или значение float, или значение типа double.
Операция приведения типа (или: конвертации типа, преобразования типа) позволяет по значению данных одного типа получить соответствующее значение данных другого типа.
В некоторых случаях компилятор сам добавляет такую операцию, тогда говорят, что приведение типов происходит неявно.
В некоторых случаях необходимо это делать явно.
Синтаксис операции:
- (тип)выражение
При некоторых преобразованиях (например, от double к int) может происходить потеря точности данных.
Например, у вас есть целая переменная n:
int n;
Предположим, нам надо вычислить результат деления 1 на n.
При использовании операции деления, способ деления — вариант операции деления — целочисленный или дробный — определяется типами аргументов. Если оба аргумента целочисленных типов, то деление целочисленное, если хотя бы один типа с плавающей точкой, то деление нецелочисленное.
Итак, в выражении: 1/n — целочисленное деление.
В выражении: 1.0/n — деление не целочисленное, потому что константа 1.0 — это константа типа double.
В выражении: (double)1/n — деление не целочисленное, потому что константу 1 (которая типа int) мы приводим к типу double, приоритет у операции приведения выше, чем у бинарных операций, так что запись (double)1/n эквивалентна по смыслу записи ((double)1)/n (здесь скобки вокруг double — это запись операции приведения типа, а вокруг (double)1 вместе — группировочные).
В выражении: 1/(double)n — тоже не целочисленное деление, запись эквивалентна 1/((double)n)
В выражении: (double)1/(double)n — тоже не целочисленное (в предыдущих двух случаях, когда компилятор понимает, что делить надо не целочисленно, он в результате неявно приводит и другой аргумент операции к double перед тем как делить один аргумент на другой).
А в выражении: (double)(1/n) деление будет целочисленное, и только то, что получилось в результате деления будет приводиться к типу double.