Konwersja typu[1][2][3][4][5], zmiana typu (zmiennej w odwołaniu, wyrażenia)[6], rzutowanie typu[4][7], przekształcenie typu[7], to konstrukcja programistyczna dostępna w określonym języku programowania, umożliwiająca traktowanie danej pewnego, konkretnego typu, jak daną innego typu[1], lub taką zmianę tej danej albo jej reprezentacji w pamięci operacyjnej, aby wartość tej danej, odpowiadała według przyjętych kryteriów odwzorowania, danej innego, wybranego typu[2]. Pojęcie konwersji odnosi się także do sytuacji wyboru, rzutowania danych, które nie posiadają przypisanego typu, na wybrany, konkretny typ, celem interpretacji tych danych. Konwersja typu jest więc w swej istocie wykonaniem pewnego, z góry ustalonego, odwzorowania pomiędzy różnymi typami[2].
Spis treści |
W językach programowania wartości, dane (reprezentowane przez np. literał, wyrażenie, a w szczególności zmienną, parametry, itd.), mogą mieć przypisane różne atrybuty, w szczególności w większości języków programowania, typ danych. Fizyczną reprezentacją danych jest jednak ciąg bitów, a atrybuty przypisane danej, decydują między innymi o tym:
W programowaniu często istnieje konieczność wykonania wspólnej operacji na danych różnych typów i różnych innych atrybutów danej. Pojawia się również konieczność traktowania danej pewnego typu jak danej innego typu, oraz jak wyżej wspomniano nadanie interpretacji danym, które nie mają przypisanego typu. Realizacja wymienionych zagadnień wymaga stosowania konwersji typu.
Konwersje typu mogą być rozróżniane według różnych kryteriów podziału.
W językach programowania są stosowane różne rozwiązania:
Konstrukcje programistyczne dotyczące wykonania konwersji typu, są elementami występującymi w kodzie źródłowym, w konkretnym języku programowania. To jakie konstrukcje są dopuszczalne wynika z przyjętych przez autorów język bądź implementacji danego języka, rozwiązań w zakresie składni i jego realizacji.
Konwersje niejawne są generowane przez translator. Programista kodując określony algorytm nie musi zajmować się zapisem takich konwersji; wystarczy, że jest świadomy sposobu ich wykonania przez środowisko programistyczne oraz efektów i skutków jakie wykonanie danej konwersji przyniesie. W kodzie źródłowym konwersja taka nie ma jakiegokolwiek odzwierciedlenia w teście kodu.
Przykładem konwersji niejawnych-automatycznych, są konwersje – w językach C[7][5], C++[5], Python[3] i innych – typów arytmetycznych dokonywane automatycznie i niejawnie w wyrażeniach. Jeżeli w wyrażeniu występują wartości o różnych typach arytmetycznych, stosuje się zasadę, że operandy typów o mniejszych rozmiarach są przekształcane do typów o większych rozmiarach. Pozwala to na używanie w jednym wyrażeniu danych typów, np. char, int, long, single, double itd.[notatka 4].
Konwersja danej może zostać wymuszona przez programistę, przy zastosowaniu istniejącego w języku lub implementacji mechanizmu automatycznej konwersji. Przykładem wymuszenia konwersji w języku JavaScript[13] jest umieszczenie w kodzie zapisu: ""+3. Użycie łańcucha pustego w operacji konkatenacji oczywiście nie zmienia wartości łańcucha wynikowego, ale ponieważ dana reprezentowana przez literał liczbowy 3 reprezentuje całkowity typ danych, następuje wymuszone przekształcenie tej liczby na łańcuch.
Operator umożliwia jawny zapis konwersji w kodzie źródłowym zgodnie z zasadami składni danego języka. Operatory konwersji dostępne są między innymi w takich językach jak:
(int)znaki, lub int(znaki),Największe możliwości w zakresie konwersji dają podprogramy, w których można definiować wiele różnych odwzorowań, nawet dla dwóch wybranych, tych samych typów. W wielu językach istnieją podprogramy wbudowane dla podstawowych konwersji. Także wiele bibliotek programistycznych oferuje podprogramy standardowe w tym zakresie. Ale największą zaletą tej metody jest możliwość definiowania własnych odwzorowań przez programistę.
Podprogramy wbudowane dostępne są m.in. w
Mechanizm ten oparty jest o wskazania tego samego obszaru pamięci przez różne zmienne wskaźnikowe, oparte na różnych typach bazowych.
W niektórych językach operacja konwersji jest odrębną kategorią jednostek składniowych, nie zaliczaną ani do operatorów, ani podprogramów, ani innych typowych konstrukcji. Tak jest np. w Turbo/Borland Pascalu[6], mimo że sam literalny zapis konwersji w kodzie źródłowym może mieć postać identyczną jak operator konwersji znany z języka C, tj.
typ(zmienna) typ(wyrażenie)
np.
integer(znak)
Znaczącą analogię do konwersji typu, jako zmiany interpretacji danej bez zmiany jej reprezentacji, można dostrzec w odniesieniu do nakładania zmiennych. Mamy tu do czynienia z interpretacją danej zawartej w pewnym obszarze przynależnym do wielu zmiennych nałożonych na ten obszar pamięci, według różnych typów przypisanych do poszczególnych zmiennych.
Przykład w języku Turbo Pascal[6]:
var znak:char; kod:byte absolute znak;
Inną, podobną analogię można dostrzec w odniesieniu do pól unii i pól pojedynczego wariantu w rekordzie z wariantami.
Poniżej pokazany jest trywialny przykład konwersji danej znakowej na daną liczbową w języku Pascal, dla środowiska Turbo Pascal.
| forma konwersji | przykład |
|---|---|
| jawna konwersja typu |
var znak:char; liczba:byte; begin znak:='1'; liczba:=byte(znak); { wypisanie liczby 49 } writeln(liczba) end. |
| podprogram standardowy Ord |
var znak:char; liczba:byte; begin znak:='1'; liczba:=Ord(znak); { wypisanie liczby 49 } writeln(liczba) end. |
| podprogram standardowy Val |
var znak:char; liczba:byte; begin znak:='1'; Val(znak, liczba); { wypisanie liczby 1 } writeln(liczba) end. |
| referencja |
var znak:char; liczba:^byte; begin znak:='1'; liczba:=Ptr(znak); { wypisanie liczby 49 } writeln(liczba^) end. |
| nakładanie zmiennych |
var znak:char; liczba:byte absolute znak; begin znak:='1'; { wypisanie liczby 49 } writeln(liczba) end. |
| rekord z wariantami |
var konwersja=record case integer of znak:char; liczba:byte; end; begin with konwersja do begin znak:='1'; { wypisanie liczby 49 } writeln(liczba) end end. |
single i double są typu zmiennoprzecikonwego, lecz definicja języka traktuje te dane, jak dane osobnych typów; jedynie niejawna konwersja pozwala na swobodne, wspólne używanie danych tych typów łącznie i zamiennie w wyrażeniach