Перетворення типів
Серед операцій, пов'язаних із типами даних існують такі, які визначені фактично для всіх типів даних. Це операції порівняння і присвоювання, тобто "перевірка рівності" (або порядку в разі впорядкованих типів) і "установка рівності". При цьому для даних, які мають великий обсяг і складну структуру, виконання цих операцій може супроводжуватися складними обчисленнями.
Окрім зазначених вище основних операцій, які використовуються у мовах програмування, є ще один клас операцій — так звані операції перетворення (приведення) типів. Ці операції відображають одні типи даних в інші. Наприклад, рядок в число або навпаки. Особливо важливі вони для структурованих типів даних.
Такі перетворення можуть ініціюватися як програмістом (тобто відбуватися явно), так і системою програмування (тобто відбуватися неявним чином).
Неявні перетворення відбуваються автоматично, по правилам, закладеним в даній мові програмування. При цьому результат неявного перетворення завжди успішний і не приводить до втрати точності.
Слід з обережністю використовувати неявне приведення типу. При перетворенні числа з дійсного типу в цілочисельний, дробова частина відкидається. Зворотне приведення з цілочисельного типу до дійсного також може привести до пониження точності, що пов'язано з різним поданням дійсних та цілочисельних чисел на машинному рівні.
При явному приведенні вказується тип змінної, до якого необходідно перетворити вихідну змінну. .Явні перетворення ініціюються програмістом або користувачем додатка, а отже, вимагають явного виклику і при цьому можуть завершуватися помилкою, а також приводити до втрати точності.
Також в мові програмування можуть бути задані спеціальні функції для приведення.
Pascal майже не дозволяє автоматичне перетворення типів. Виключення зроблено тільки у відношенні до констант та змінних цілих типів, які дозволяється використовувати у виразах дійсного типу. Наприклад, якщо змінні X та Y описані наступним чином:
Var X: integer;
Y: real;
то оператор
Y := X+2.78;
синтаксично не має помилок, хоча типи змінних і не співпадають. Перетворення типів (з цілого у дійсний) в цьому випадку виконується автоматично. В той же час оператор:
X := 2.78;
буде помилковим, тому що автоматичне перетворення дійсних типів у цілі не виконується.
Слід заначити, що константа 12.0 з точки зору компілятора буде також дійсною, хоча дробова частина і дорівнює нулю, тому що константа містить десяткову точку.
Відсутність автоматичного перетворення типів у Pascal не означає, що він зовсім не має засобів перетворення даних: просто їх необхідно використовувати явно. Так, для перетворення значень одного скалярного типу в інший можна використовувати наступні функції перетворення типів:
Chr(I) - перетворює цілий тип у літерний, тобто повертає символ стандартного коду таблиці ASCII з номером, що дорівнює значенню I. Якщо значення більше 255, виникає програмне переривання. Наприклад: Chr(105); результат - 'i'.
Ord(S) - для значень літерного типу S, функція Ord повертає їх номер у відповідності з таблицею ASCII. Таким чином, літерний тип перетворюється у цілий. Наприклад: Ord('A'); результат - 65.
У мові С для явного приведення типів слід перед відповідною змінною вказати в круглих дужках ім'я нового типу:
(ім'я типу) вираз.
Наприклад:
int X;
float Y;
…
Y = (float)X/12;