Ця стаття містить , але походження тверджень у ній через практично повну відсутність . (січень 2019) |
Приведення (перетворення) типів (англ. type conversion, typecasting, coercion) — в програмуванні це зміна типу сутності одного типу даних в інший, що може відбуватися різними способами, явно чи неявно.
Це використовується з ціллю скористатися деякими особливостями ієрархій типів або подання типу. Одним із прикладів такої ситуації є використання невеликих цілих чисел, які зберігаються в більш компактному форматі змінної і приводяться в тип з більшим діапазоном значень для проведення арифметичних операцій. В об'єктно-орієнтованому програмуванні, дозволяє програмам приводити об'єкти різного типу до їх спільного батьківського типу, для спрощення операцій з ними.
Кожна мова програмування має свої правила приведення типів даних. Загалом, перетворювати можна і об'єктні типи і основні типи даних. В більшості мов, слово coercion використовується позначення неявних перетворень типів, або під час компіляції або під . Типовим прикладом може бути вираз де в одному виразі присутні цілі числа і дробові числа з рухомою комою (такому як 5 + 0,1), в якому цілі числа як правило перетворюються в дробові. Явне перетворення типів може виконуватись або за допомогою вбудованих процедур (або спеціальних синтаксичних конструкцій) мови програмування або за допомогою окремо визначених процедур перетворення, таких як перевантажений конструктор об'єкту.
В більшості мов сімейства ALGOL з можливістю визначати вкладені функції, таких як Ada, Паскаль, Object Pascal і , conversion (перетворення) і casting (приведення) це два окремі поняття. В цих мовах, перетворення відноситься до явного або неявного перенесення значення з одного типу даних в інший, наприклад 16-розрядне ціле число в 32-розрядне. Вимоги щодо зберігання змінної в новому форматі можуть змінитися в результаті перетворення. Може відбуватися втрата точності або відсікання молодших розрядів. Поняття приведення, в свою чергу, відноситься до явного змінення інтерпретації способу збереження в бітах при переведенні значення з одного типу в інший. Наприклад 32 послідовних біта можуть представлятися у вигляді масиву із 32 елементів типу boolean, а рядок в 4 байти може представлятися як 32 бітне ціле або число з рухомою комою одинарної точності. Оскільки вимоги до зберігання значень не змінюються, таке перетворення все одно вимагає знань про низькорівневу організацію даних в конкретному форматі, порядок байтів, вирівнювання для того, щоб розуміти що відбувається.
В родині мов програмування C і , поняття cast приведення зазвичай має зміст явного перетворення типів, незалежно від того, чи змінює це спосіб збереження біт або є реальним перетворенням.
Перетворення типів в мові C
Неявне перетворення типу
Неявне перетворення типів, також відоме як примусове, це автоматичне перетворення типів при компіляції. Деякі мови програмування дозволяють компіляторам здійснювати перетворення; інші вимагають здійснити його явно.
У виразах зі мішаними типами змінних, дані одного або декількох можуть при необхідності бути перетворені до супертипу під таким чином, що програма буде виконуватись коректно. Наприклад, приведений нижче код є правильним для мови C:
double d; long l; int i; if (d > i) d = i; if (i > l) l = i; if (d == l) d *= 2;
Хоча змінні d, l і i належать до різних типів даних, вони будуть автоматично перетворюватись в один тип даних кожен раз коли буде виконуватись операція порівняння або присвоювання. Таке неявне приведення типів може привести до небажаних наслідків. При перетворенні чисел з рухомою комою в цілі може відбуватися втрата точності, оскільки дробова частина числа буде відкинута (з округленням в бік нуля). І навпаки, при перетворенні цілого значення до числа з рухомою комою також може відбуватися втрата точності, оскільки тип, що представляє дрібне число не може вмістити і представити точно дане ціле число (наприклад, тип float в стандарті IEEE 754 може мати одинарну точність, яка не може коректно представити ціле число 16777217, в той час як 32-ух бітний тип integer може). Це може привести до незрозумілої поведінки, як показано в наступному коді:
#include <stdio.h> int main(void) { int i_value = 16777217; float f_value = 16777216.0; printf("Ціле (integer): %d\n", i_value); printf("З рухомою комою (float): %f\n", f_value); printf("Їх рівність: %d\n", i_value == f_value); }
При збірці компілятором який реалізує числа з рухомою точкою одинарної точності IEEE, і цілі числа в 32 біти, цей код виведе такий результат на екран:
Ціле (integer): 16777217 З рухомою комою (float): 16777216.000000 Їх рівність: 1
Зверніть увагу, що на екрані буде виведено 1 в останньому рядку, це означає, що числа вважаються рівними при порівнянні. Ця дивна поведінка викликана неявним перетворенням i_value у тип float при порівнянні числа з f_value. Перетворення приводить до втрати точності, що робить значення рівними перед операцією порівняння.
Важливі примітки:
- Приведення float до int призводить до усічення, тобто відкидання дробової частини;
- Приведення double до float призводить до округлення числа;
- Приведення long до int призводить до втрати надлишкових верхніх розрядів.
Розширення типів
Окремим випадком неявного приведення типів є розширення типу, при якому компілятор автоматично розширяє двійкове представлення об'єктів цілого типу або типу з рухомою комою. Розширення зазвичай відбувається із типами, які менші ніж вбудований тип АЛП цільової платформи, на якій виконується програма. Це відбувається перед арифметичними і логічними операціями для того, щоб ці операції стали можливими, або більш ефективними, у випадку коли АЛП, може працювати більше ніж з одним типом даних. C і C++ виконують таке розширення для об'єктів логічного, символьного, широкого символьного, перечислення, і короткого цілого типів, які перетворюються в int, і для об'єктів типу float, які розширюються до типу double. На відміну від інших від інших перетворень типів, розширення ніколи не призводить до втрати точності або зміни значення, збереженого в змінній.
Явне перетворення типу
Явне перетворення типів, це таке приведення типів даних, яке задається в явному вигляді в рамках програми (замість того, щоб відбулося неявне перетворення типів компілятором).
double da = 3.3; double db = 3.3; double dc = 3.4; int result = (int)da + (int)db + (int)dc; //result == 9 //якби тут відбулося неявне перетворення типів (як при написанні виразу "result = da + db + dc"), результат би дорівнював 10
Існує кілька видів явного перетворення.
- з перевіркою
- Перед перетворенням виконується перевірка під час виконання програми, яка визначає чи може вихідний тип вмістити початкове значення. Якщо ні, повертається помилка.
- без перевірки
- Перевірка не виконується. Якщо вихідний тип не може містити початкове значення, результат буде не визначений.
- по бітовому шаблону
- Бітове представлення вихідних даних копіюється, і інтерпретується по новому відповідно до вихідного типу, в який перетворюється значення. Це відбувається також при використанні псевдонімів.
В об’єктно-орієнтованому програмуванні, об'єкти також можна приводити : посилання на базовий клас може вказувати на його похідні (дочірні) класи.
Використання перевантаженого конструктора об'єкта
class Myclass { public: double myD; Myclass(double d) : myD(d) {}; }; int main(int argc, char *argv[]) { Myclass obj = 5.2; // Це перетворення типів return 0; }
Джерела
Посилання
- Приведення типів в ABAP
- Приведення типів в Ada
- Приведення типів в C++
- Неявне приведення типів в C#
- Неявне приведення типів Cppreference.com
- Static and Reinterpretation castings in C++
- Приведення до базового типу і приведення з пониженням типів
Вікіпедія, Українська, Україна, книга, книги, бібліотека, стаття, читати, завантажити, безкоштовно, безкоштовно завантажити, mp3, відео, mp4, 3gp, jpg, jpeg, gif, png, малюнок, музика, пісня, фільм, книга, гра, ігри, мобільний, телефон, android, ios, apple, мобільний телефон, samsung, iphone, xiomi, xiaomi, redmi, honor, oppo, nokia, sonya, mi, ПК, web, Інтернет
Cya stattya mistit perelik posilan ale pohodzhennya tverdzhen u nij zalishayetsya nezrozumilim cherez praktichno povnu vidsutnist vnutrishnotekstovih dzherel vinosok Bud laska dopomozhit polipshiti cyu stattyu peretvorivshi dzherela z pereliku posilan na dzherela vinoski u samomu teksti statti sichen 2019 Privedennya peretvorennya tipiv angl type conversion typecasting coercion v programuvanni ce zmina tipu sutnosti odnogo tipu danih v inshij sho mozhe vidbuvatisya riznimi sposobami yavno chi neyavno Ce vikoristovuyetsya z cillyu skoristatisya deyakimi osoblivostyami iyerarhij tipiv abo podannya tipu Odnim iz prikladiv takoyi situaciyi ye vikoristannya nevelikih cilih chisel yaki zberigayutsya v bilsh kompaktnomu formati zminnoyi i privodyatsya v tip z bilshim diapazonom znachen dlya provedennya arifmetichnih operacij V ob yektno oriyentovanomu programuvanni dozvolyaye programam privoditi ob yekti riznogo tipu do yih spilnogo batkivskogo tipu dlya sproshennya operacij z nimi Kozhna mova programuvannya maye svoyi pravila privedennya tipiv danih Zagalom peretvoryuvati mozhna i ob yektni tipi i osnovni tipi danih V bilshosti mov slovo coercion vikoristovuyetsya poznachennya neyavnih peretvoren tipiv abo pid chas kompilyaciyi abo pid Tipovim prikladom mozhe buti viraz de v odnomu virazi prisutni cili chisla i drobovi chisla z ruhomoyu komoyu takomu yak 5 0 1 v yakomu cili chisla yak pravilo peretvoryuyutsya v drobovi Yavne peretvorennya tipiv mozhe vikonuvatis abo za dopomogoyu vbudovanih procedur abo specialnih sintaksichnih konstrukcij movi programuvannya abo za dopomogoyu okremo viznachenih procedur peretvorennya takih yak perevantazhenij konstruktor ob yektu V bilshosti mov simejstva ALGOL z mozhlivistyu viznachati vkladeni funkciyi takih yak Ada Paskal Object Pascal i conversion peretvorennya i casting privedennya ce dva okremi ponyattya V cih movah peretvorennya vidnositsya do yavnogo abo neyavnogo perenesennya znachennya z odnogo tipu danih v inshij napriklad 16 rozryadne cile chislo v 32 rozryadne Vimogi shodo zberigannya zminnoyi v novomu formati mozhut zminitisya v rezultati peretvorennya Mozhe vidbuvatisya vtrata tochnosti abo vidsikannya molodshih rozryadiv Ponyattya privedennya v svoyu chergu vidnositsya do yavnogo zminennya interpretaciyi sposobu zberezhennya v bitah pri perevedenni znachennya z odnogo tipu v inshij Napriklad 32 poslidovnih bita mozhut predstavlyatisya u viglyadi masivu iz 32 elementiv tipu boolean a ryadok v 4 bajti mozhe predstavlyatisya yak 32 bitne cile abo chislo z ruhomoyu komoyu odinarnoyi tochnosti Oskilki vimogi do zberigannya znachen ne zminyuyutsya take peretvorennya vse odno vimagaye znan pro nizkorivnevu organizaciyu danih v konkretnomu formati poryadok bajtiv virivnyuvannya dlya togo shob rozumiti sho vidbuvayetsya V rodini mov programuvannya C i ponyattya cast privedennya zazvichaj maye zmist yavnogo peretvorennya tipiv nezalezhno vid togo chi zminyuye ce sposib zberezhennya bit abo ye realnim peretvorennyam Peretvorennya tipiv v movi CNeyavne peretvorennya tipu Neyavne peretvorennya tipiv takozh vidome yak primusove ce avtomatichne peretvorennya tipiv pri kompilyaciyi Deyaki movi programuvannya dozvolyayut kompilyatoram zdijsnyuvati peretvorennya inshi vimagayut zdijsniti jogo yavno U virazah zi mishanimi tipami zminnih dani odnogo abo dekilkoh mozhut pri neobhidnosti buti peretvoreni do supertipu pid takim chinom sho programa bude vikonuvatis korektno Napriklad privedenij nizhche kod ye pravilnim dlya movi C double d long l int i if d gt i d i if i gt l l i if d l d 2 Hocha zminni d l i i nalezhat do riznih tipiv danih voni budut avtomatichno peretvoryuvatis v odin tip danih kozhen raz koli bude vikonuvatis operaciya porivnyannya abo prisvoyuvannya Take neyavne privedennya tipiv mozhe privesti do nebazhanih naslidkiv Pri peretvorenni chisel z ruhomoyu komoyu v cili mozhe vidbuvatisya vtrata tochnosti oskilki drobova chastina chisla bude vidkinuta z okruglennyam v bik nulya I navpaki pri peretvorenni cilogo znachennya do chisla z ruhomoyu komoyu takozh mozhe vidbuvatisya vtrata tochnosti oskilki tip sho predstavlyaye dribne chislo ne mozhe vmistiti i predstaviti tochno dane cile chislo napriklad tip float v standarti IEEE 754 mozhe mati odinarnu tochnist yaka ne mozhe korektno predstaviti cile chislo 16777217 v toj chas yak 32 uh bitnij tip integer mozhe Ce mozhe privesti do nezrozumiloyi povedinki yak pokazano v nastupnomu kodi include lt stdio h gt int main void int i value 16777217 float f value 16777216 0 printf Cile integer d n i value printf Z ruhomoyu komoyu float f n f value printf Yih rivnist d n i value f value Pri zbirci kompilyatorom yakij realizuye chisla z ruhomoyu tochkoyu odinarnoyi tochnosti IEEE i cili chisla v 32 biti cej kod vivede takij rezultat na ekran Cile integer 16777217 Z ruhomoyu komoyu float 16777216 000000 Yih rivnist 1 Zvernit uvagu sho na ekrani bude vivedeno 1 v ostannomu ryadku ce oznachaye sho chisla vvazhayutsya rivnimi pri porivnyanni Cya divna povedinka viklikana neyavnim peretvorennyam i value u tip float pri porivnyanni chisla z f value Peretvorennya privodit do vtrati tochnosti sho robit znachennya rivnimi pered operaciyeyu porivnyannya Vazhlivi primitki Privedennya float do int prizvodit do usichennya tobto vidkidannya drobovoyi chastini Privedennya double do float prizvodit do okruglennya chisla Privedennya long do int prizvodit do vtrati nadlishkovih verhnih rozryadiv Rozshirennya tipiv Okremim vipadkom neyavnogo privedennya tipiv ye rozshirennya tipu pri yakomu kompilyator avtomatichno rozshiryaye dvijkove predstavlennya ob yektiv cilogo tipu abo tipu z ruhomoyu komoyu Rozshirennya zazvichaj vidbuvayetsya iz tipami yaki menshi nizh vbudovanij tip ALP cilovoyi platformi na yakij vikonuyetsya programa Ce vidbuvayetsya pered arifmetichnimi i logichnimi operaciyami dlya togo shob ci operaciyi stali mozhlivimi abo bilsh efektivnimi u vipadku koli ALP mozhe pracyuvati bilshe nizh z odnim tipom danih C i C vikonuyut take rozshirennya dlya ob yektiv logichnogo simvolnogo shirokogo simvolnogo perechislennya i korotkogo cilogo tipiv yaki peretvoryuyutsya v int i dlya ob yektiv tipu float yaki rozshiryuyutsya do tipu double Na vidminu vid inshih vid inshih peretvoren tipiv rozshirennya nikoli ne prizvodit do vtrati tochnosti abo zmini znachennya zberezhenogo v zminnij Yavne peretvorennya tipu Yavne peretvorennya tipiv ce take privedennya tipiv danih yake zadayetsya v yavnomu viglyadi v ramkah programi zamist togo shob vidbulosya neyavne peretvorennya tipiv kompilyatorom double da 3 3 double db 3 3 double dc 3 4 int result int da int db int dc result 9 yakbi tut vidbulosya neyavne peretvorennya tipiv yak pri napisanni virazu result da db dc rezultat bi dorivnyuvav 10 Isnuye kilka vidiv yavnogo peretvorennya z perevirkoyu Pered peretvorennyam vikonuyetsya perevirka pid chas vikonannya programi yaka viznachaye chi mozhe vihidnij tip vmistiti pochatkove znachennya Yaksho ni povertayetsya pomilka bez perevirki Perevirka ne vikonuyetsya Yaksho vihidnij tip ne mozhe mistiti pochatkove znachennya rezultat bude ne viznachenij po bitovomu shablonu Bitove predstavlennya vihidnih danih kopiyuyetsya i interpretuyetsya po novomu vidpovidno do vihidnogo tipu v yakij peretvoryuyetsya znachennya Ce vidbuvayetsya takozh pri vikoristanni psevdonimiv V ob yektno oriyentovanomu programuvanni ob yekti takozh mozhna privoditi posilannya na bazovij klas mozhe vkazuvati na jogo pohidni dochirni klasi Vikoristannya perevantazhenogo konstruktora ob yekta class Myclass public double myD Myclass double d myD d int main int argc char argv Myclass obj 5 2 Ce peretvorennya tipiv return 0 DzherelaPosilannyaPrivedennya tipiv v ABAP Privedennya tipiv v Ada Privedennya tipiv v C Neyavne privedennya tipiv v C Neyavne privedennya tipiv Cppreference com Static and Reinterpretation castings in C Privedennya do bazovogo tipu i privedennya z ponizhennyam tipiv