Najlepsze pytania
Chronologia
Czat
Perspektywa
Konwersja typu
Z Wikipedii, wolnej encyklopedii
Remove ads
Konwersja typu, zmiana typu (zmiennej w odwołaniu, wyrażenia), rzutowanie typu, przekształcenie typu – konstrukcja programistyczna 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.
Remove ads
Zastosowanie konwersji typu
W językach programowania wartości, dane (reprezentowane np. przez 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:
- jak długi ciąg bitów stanowi określoną daną,
- w jaki sposób jest interpretowany ciąg bitów określonej długości, stanowiący rozpatrywaną daną; ten sam ciąg bitów może być interpretowany zarówno jako liczba, łańcuch znaków, wartość logiczna itd.[a]
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.
Remove ads
Rodzaje konwersji
Konwersje typu mogą być rozróżniane według rozmaitych kryteriów podziału.
- Podział ze względu na sposób specyfikacji:
- jawne,
- ukryte (automatyczne).
- Podział według konstrukcji programistycznej:
- automatyczne,
- wymuszone,
- operator konwersji,
- podprogram,
- referencja,
- inne, odrębne konstrukcje.
- Podział według sposobu realizacji:
- konwersje bez zmiany sposobu reprezentacji danej w pamięci i rozmiaru danej – tylko zmiana interpretacji,
- konwersje ze zmianą atrybutu rozmiaru danej, bez zmiany sposobu interpretacji danej,
- konwersje ze zmianą sposobu reprezentacji bez zmiany interpretacji danej,
- konwersje ze zmianą sposobu interpretacji danej.
- Podział ze względu na utratę (części) informacji:
- konwersje bez utraty informacji,
- konwersje z częściową utratą informacji.
Remove ads
Języki programowania
W językach programowania są stosowane różne rozwiązania:
- konwersje mogą być zbędne, interpretacja danej następuje w określonym kontekście według narzuconego klucza – języki operujące tylko prostymi, beztypowymi[b] danymi, np. tylko słowem, bajtem itp.: PL/M[3], BCPL[1], Bliss[1], Forth[4], ewentualne konwersje w tych językach ograniczają się do rozszerzania mniejszych danych do rozmiaru większych danych, np. danej bajtowej do dwu bajtowej (słowowej do dwusłowowej[4]),
- konwersje mogą być niedopuszczalne,
- konwersje mogą być dopuszczalne w określonym zakresie – wymagane jest jawne specyfikowanie konwersji,
- konwersje mogą być dopuszczalne w określonym zakresie oraz pewne konwersje mogą być wykonywane automatycznie – większość uniwersalnych języków programowania, np. C[5], C++[6], Pascal[7][8] itd.
- konwersje wykonywanie automatycznie, użycie danej określonego typu dopuszczalne w każdym kontekście, np. PL/1[c][9], Snobol[10].
Konstrukcje programistyczne
Podsumowanie
Perspektywa
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
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 tekście kodu.
Przykładem konwersji niejawnych-automatycznych, są konwersje – w językach C[5][6], C++[6], Python[11] 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.[d].
Konwersje wymuszone
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[12] jest umieszczenie w kodzie zapisu: „"+3
. Użycie łańcucha pustego w operacji konkatenacji 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.
Operatory konwersji
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:
Podprogramy
Największe możliwości w zakresie konwersji dają podprogramy, w których można definiować różne odwzorowania, nawet dla dwóch wybranych, tych samych typów. W językach istnieją podprogramy wbudowane dla podstawowych konwersji. Także biblioteki programistyczne oferują podprogramy standardowe w tym zakresie. Największą zaletą tej metody jest możliwość definiowania własnych odwzorowań przez programistę.
Podprogramy wbudowane dostępne są m.in. w:
Referencja
Mechanizm ten oparty jest na wskazaniach tego samego obszaru pamięci przez różne zmienne wskaźnikowe, oparte na różnych typach bazowych.
Inne, odrębne konstrukcje
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[8], 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)
Remove ads
Inne, analogiczne konstrukcje
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[8]:
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.
Remove ads
Porównanie konstrukcji
Podsumowanie
Perspektywa
Poniżej pokazany jest trywialny przykład konwersji danej znakowej na daną liczbową w języku Pascal, dla środowiska Turbo Pascal.
Remove ads
Zobacz też
Uwagi
- Abstrahując od sensu merytorycznego takiej interpretacji.
- W językach tych nie istnieje pojęcie typu, co najwyżej rozmiar danej, a jej interpretacja zależy od kontekstu.
- W Snobolu przekształcenia takie wiążą się z przetwarzaniem łańcuchów, na które ukierunkowano ten język.
- W wielu językach pojęcie typu obejmuje nie tylko rodzaj zapisanej danej, ale jej wielkość, np. w języku C i pokrewnych, dane typu
single
idouble
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. - Przyjęto, że w danym systemie komputerowym obowiązuje tabela kodów znaków ASCII.
Remove ads
Przypisy
Wikiwand - on
Seamless Wikipedia browsing. On steroids.
Remove ads