Приведение типа | это... Что такое Приведение типа? (original) (raw)

Приведе́ние ти́па (type conversion) — преобразование значения переменной одного типа в значение другого типа. Выделяют явное и неявное приведения типов.

Содержание

Неявное приведение

Само приведение происходит как во время присваивания значения переменной, так и при операциях сравнения, вычисления выражения. При использовании в выражении несколько различных типов значения одного или нескольких подтипов может быть осуществлено преобразование к более общему типу (супертипу), с большим диапазоном возможных значений.

В языке C:

double d; // вещественный тип long l; // целый тип int i; // целый тип

if (d > i) d = i; if (i > l) l = i; if (d == l) d *= 2;

Каждый раз при выполнени операции сравнения или присваивания переменные разных типов будут приведены к единому типу. Следует с осторожностью использовать неявное приведение типа. При переводе числа из вещественного типа в целочисленный, дробная часть отсекается. Обратное приведение из целочисленного типа к вещественному также может привести к понижению точности, что связано с различным представлением вещественных и целочисленных чисел на машинном уровне. К примеру, вещественный тип single стандарта IEEE 754 не может точно представить число 16777217, в то время как 32-битный целочисленный тип может. Это может привести к ситуациям, когда сравнение на равенство одного и того же числа, представленного типами (int и single) будет выдавать ложный результат (числа не равны друг другу).

Явное приведение типа

В языке C

Для явного приведения типов некоторой переменной перед ней следует указать в круглых скобках имя нового типа, например:

int X; int Y = 200; char C = 30; X = (int)C * 10 + Y; //переменная С приведена к типу int.

Грубых ошибок в данном примере от автоматического приведения типов не произойдет, так как переменная C, которая имеет тип char будет приведена к типу int, так как здесь идет речь о «повышении» типа переменной к старшему в выражении(переменная С перед присваиванием неявно приводится к типу переменной Y). Но возможен один нюанс - в зависимости от машинной реализации типа char при преобразовании char в int может получиться отрицательное число, потому рекомендуется использовать явное преобразование, а если все-таки есть преобразования типа char в int, char объявлять как беззнаковый(unsigned char).

В языке C++

В языке C++ существует четыре разновидности приведения типа. Все четыре типа записываются в виде

xxx_cast(expression_from)

Например:

y = static_cast(65534); // будет присвоено -2

Громоздкие ключевые слова являются напоминанием программисту, что приведение типа чревато проблемами.

static_cast

// Возвращает процент попаданий. double hitpercent(const int aHitCount, const int aShotCount) { if (aShotCount==0) return 0.0; // Нам нужно дробное деление, а не целочисленное - поэтому переведём делимое и делитель в double return static_cast(aHitCount*100) / static_cast(aShotCount); }

string s = static_cast("Hello!"); // аналогично string s = string("Hello!"); string s = (string)"Hello!"; // синтаксис Си тоже работает string s = static_cast(5); // не компилируется - нет подходящего конструктора

[dynamic_cast](1267781)

const_cast

namespace { // Каждая загрузка DLL создаёт новый сегмент данных. // Так что с такими глобальными переменными одна программа не будет // мешать другой. string s = "Wikipedia"; }

typedef char* PChar;

// Функция экспортируется DLL'ем и возвращает какую-то строку // в виде char*. Проблема в том, что std:🧵:c_str() возвращает // const char*. void __declspec(dllexport) WINAPI SomeDllFunction(PChar& rMessage) { rMessage = const_cast<char*>(s.c_str()); }

reinterpret_cast

// Возвращает true, если число конечное, и false - если бесконечное или NaN. // Работает на 32- и 64-битном IBM PC. bool isfinite(const double x) { const long long& y = reinterpret_cast<const long long&>(x); return ((y & 0x7FF0000000000000LL) != 0x7FF0000000000000LL); }

// Ошибка - выражение x+5.0 не является ссылкой. const long long& y = reinterpret_cast<const long long&>(x+5.0);

См. также

Есть более полная статья