Skip to content

Операция приведения типа

Yuriy Syrovetskiy edited this page Dec 26, 2017 · 1 revision

Данные разных типов представляются (хранятся) в компьютере разным способом.

Например, числовое значение, соответствующее смыслу математической записи 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.

Clone this wiki locally