Pisząc programy w MQL4, może pojawić się potrzeba konwersji (przekształcenia) typu zmiennej na inny typ. W lekcji 3. MQL4 dla początkujących. Część III, zostały już omówione podstawowe typy stosowane w MQL4, takie jak:
Konwersje typów zmiennych można podzielić na 2 grupy:
Jak wskazuje nazwa, jest realizowana przez programistę z wykorzystaniem (a) konstrukcji języka lub (b) funkcji, która przyjmuje wartość jednego typu, a zwraca wartość innego typu.
Jest realizowana samodzielnie przez kompilator języka programowania, zgodnie z zasadami opisanymi w dokumentacji danego języka. W tym przypadku programista powinien być świadom obowiązujących standardów, aby móc poprawnie korzystać z ukrytej konwersji.
Zacznijmy od analizy konwersji typów liczb całkowitych. Na poniższym rysunku 1 zobrazowałem granice liczb, jakie mogą być przechowywane w pamięci RAM przez poszczególne typy. Na tym rysunku środkowa pionowa linia oznacza liczbę 0, tj. minimalną liczbę dla uchar, ushort, uint i ulong.
Rys. 1. Granice liczb typów całkowitych.
Patrząc na tę "piramidę", można zidentyfikować kierunki utraty informacji podczas konwersji. Na przykład, jeśli w programie zostanie utworzona zmienna typu short, to jej konwersja do int lub long odbędzie się bez utraty informacji, ponieważ mogą one przechowywać w RAM liczby o większym zakresie. Z kolei podczas konwersji z short do char może mieć miejsce utrata informacji, ponieważ w nowym typie nie pomieszczą się liczby mniejsze niż (minus) -128 i większe niż 127.
W przypadku próby konwersji short na uchar, ushort, uint lub ulong też może nastąpić utrata informacji ze względu na to, że te typy nie służą do przechowywania liczb ujemnych.
Wartość liczbową typu uint możemy przekonwertować do long oraz ulong bez obawy o utratę informacji, dlatego że ich zakres przechowywania liczb jest szerszy. W przypadku pozostałych typów nie możemy być tego pewni. Z kolei typ uchar można bezstresowo konwertować na wszystkie inne typy liczb całkowitych, oprócz char.
Widzimy tu prostą zależność: jeśli jakiś typ liczby całkowitej chcemy przekonwertować na inny typ i mieć pewność braku utraty informacji, nowy typ swoim zakresem musi całkowicie obejmować poprzedni.
Teraz omówmy konwersje typu liczby całkowitej do typu liczby zmiennoprzecinkowej. Na poniższym rysunku 2 zielonymi strzałkami są pokazane konwersje bez utraty informacji, a brak strzałki oznacza możliwą utratę informacji.
Rys. 2. Konwersje typów liczb całkowitych do typów liczb zmiennoprzecinkowych.
Jak widać konwersje z char, uchar, short i ushort do typów float i double zachodzą bez utraty informacji. W przypadku konwersji z int i uint do double też nie musimy się o to martwić. Z kolei w trakcie konwersji int, uint, long i ulong do float oraz konwersji z long i ulong do double może mieć miejsce utrata informacji.
Aby zrozumieć te zależności przypomnijmy ile bajtów w pamięci RAM zajmuje każdy z tych typów:
Tak więc konwersja liczby całkowitej o mniejszej "rozdzielczości" (np. 1 lub 2 bajty) na liczbę zmiennoprzecinkową o większej "rozdzielczości" (np. 4 lub 8 bajtów) zachodzi bez utraty informacji. Z kolei utrata informacji może mieć miejsce w przypadku konwersji liczby całkowitej na liczbę zmiennoprzecinkową o takiej samej "rozdzielczości" (np. 4 bajty int na 4 bajty float) lub mniejszej "rozdzielczości" (np. 8 bajtów long na 4 bajty float).
W przypadku odwrotnej konwersji z liczby zmiennoprzecinkowej na liczbę całkowitą kompilator zawsze wyświetli ostrzeżenie o możliwej utracie informacji, ponieważ przy takim przekształceniu część dziesiętna jest odrzucana. Na pierwszy rzut oka temat konwersji może być skomplikowany, jednak w kolejnych rozdziałach na przykładach pokażę, że jest to do ogarnięcia.