Type conversion
कंप्यूटर विज्ञान में, टाइप रूपांतरण, टाइप कास्टिंग, टाइप जबरदस्ती और टाइप बाजीगरी एक अभिव्यक्ति को एक डेटा प्रकार से दूसरे में बदलने के अलग-अलग तरीके हैं। एक उदाहरण एक पूर्णांक मूल्य का एक फ्लोटिंग बिंदु मूल्य में रूपांतरण या एक स्ट्रिंग के रूप में इसका पाठ्य प्रतिनिधित्व होगा, और इसके विपरीत। प्रकार रूपांतरण प्रकार पदानुक्रम या डेटा प्रतिनिधित्व की कुछ विशेषताओं का लाभ उठा सकते हैं। एक प्रकार के रूपांतरण के दो महत्वपूर्ण पहलू हैं कि क्या यह निहित रूप से (स्वचालित रूप से) या स्पष्ट रूप से होता है, और क्या अंतर्निहित डेटा प्रतिनिधित्व को एक प्रतिनिधित्व से दूसरे में परिवर्तित किया जाता है, या दिए गए प्रतिनिधित्व को केवल दूसरे डेटा प्रकार के प्रतिनिधित्व के रूप में पुनः व्याख्या की जाती है। सामान्य तौर पर, दोनों आदिम और यौगिक डेटा प्रकारों को परिवर्तित किया जा सकता है। प्रत्येक प्रोग्रामिंग भाषा के अपने नियम होते हैं कि किस प्रकार को परिवर्तित किया जा सकता है। मजबूत टाइपिंग वाली भाषाएं आम तौर पर बहुत कम अंतर्निहित रूपांतरण करती हैं और अभ्यावेदन की पुनर्व्याख्या को हतोत्साहित करती हैं, जबकि कमजोर टाइपिंग वाली भाषाएं डेटा प्रकारों के बीच कई अंतर्निहित रूपांतरण करती हैं। कमजोर टाइपिंग भाषा अक्सर संकलक को मनमाने ढंग से एक डेटा आइटम की व्याख्या करने के लिए मजबूर करने की अनुमति देती है जिसमें अलग-अलग प्रतिनिधित्व होते हैं-यह एक गैर-स्पष्ट प्रोग्रामिंग त्रुटि हो सकती है, या अंतर्निहित हार्डवेयर से सीधे निपटने के लिए एक तकनीकी विधि हो सकती है। अधिकांश भाषाओं में, जबरदस्ती शब्द का उपयोग संकलन के दौरान या रन टाइम के दौरान एक अंतर्निहित रूपांतरण को दर्शाने के लिए किया जाता है। उदाहरण के लिए, एक अभिव्यक्ति मिश्रण पूर्णांक और तैरते बिंदु संख्या (जैसे 5 + 0.1) में, संकलक स्वचालित रूप से पूर्णांक प्रतिनिधित्व को तैरते बिंदु प्रतिनिधित्व में बदल देगा ताकि अंश नष्ट न हों। स्पष्ट प्रकार के रूपांतरणों को या तो अतिरिक्त कोड लिखकर इंगित किया जाता है (जैसे। प्रकार पहचानकर्ताओं को जोड़ना या अंतर्निहित दिनचर्या को कॉल करना) या संकलक के लिए रूपांतरण दिनचर्या को कोडिंग करके उपयोग करने के लिए जब यह अन्यथा एक प्रकार बेमेल के साथ रुक जाएगा। अधिकांश ए. एल. जी. ओ. एल. जैसी भाषाओं में, जैसे कि पास्कल, मोडुला-2, अदा और डेल्फी, रूपांतरण और कास्टिंग स्पष्ट रूप से अलग अवधारणाएं हैं। इन भाषाओं में, रूपांतरण या तो निहित रूप से या स्पष्ट रूप से एक डेटा प्रकार भंडारण प्रारूप से दूसरे में एक मूल्य को बदलने को संदर्भित करता है, जैसे। 32-बिट पूर्णांक के लिए 16-बिट पूर्णांक। रूपांतरण के परिणामस्वरूप भंडारण की आवश्यकताएँ बदल सकती हैं, जिसमें सटीकता या छंटाई का संभावित नुकसान भी शामिल है। दूसरी ओर, कास्ट शब्द, एक प्रकार से दूसरे प्रकार में मूल्य का प्रतिनिधित्व करने वाले बिट पैटर्न की व्याख्या को स्पष्ट रूप से बदलने को संदर्भित करता है। उदाहरण के लिए, 32 सन्निहित बिट्स को 32 बूलियन की एक सरणी, एक 4-बिट स्ट्रिंग, एक अहस्ताक्षरित 32-बिट पूर्णांक या एक आई. ई. ई. ई. एकल परिशुद्धता तैरते बिंदु मूल्य के रूप में माना जा सकता है। चूंकि संग्रहीत बिट्स कभी नहीं बदले जाते हैं, इसलिए प्रोग्रामर को सार्थक रूप से कास्ट करने के लिए प्रतिनिधित्व प्रारूप, बाइट ऑर्डर और संरेखण आवश्यकताओं जैसे निम्न स्तर के विवरणों को जानना चाहिए। भाषाओं के सी परिवार और एएलजीओएल 68 में, कास्ट शब्द आम तौर पर एक स्पष्ट प्रकार के रूपांतरण को संदर्भित करता है (एक अंतर्निहित रूपांतरण के विपरीत), जिससे इस बारे में कुछ अस्पष्टता पैदा होती है कि क्या यह एक बिट-पैटर्न की पुनः व्याख्या है या एक वास्तविक डेटा प्रतिनिधित्व रूपांतरण है। अधिक महत्वपूर्ण उन तरीकों और नियमों की भीड़ है जो एक सूचक द्वारा स्थित डेटा प्रकार (या वर्ग) पर लागू होते हैं और वस्तु (वर्ग) विरासत जैसे मामलों में संकलक द्वारा एक सूचक को कैसे समायोजित किया जा सकता है। विभिन्न भाषाओं में स्पष्ट कास्टिंग अदा अदा एक सामान्य पुस्तकालय कार्य अनचेक्ड _ कन्वर्जन प्रदान करता है। सी-जैसी भाषाएं अंतर्निहित प्रकार रूपांतरण अंतर्निहित प्रकार रूपांतरण, जिसे जबरदस्ती या प्रकार बाजीगरी के रूप में भी जाना जाता है, संकलक द्वारा एक स्वचालित प्रकार रूपांतरण है। कुछ प्रोग्रामिंग भाषाएँ संकलकों को जबरदस्ती प्रदान करने की अनुमति देती हैं; दूसरों को इसकी आवश्यकता होती है। एक मिश्रित प्रकार की अभिव्यक्ति में, एक या अधिक उपप्रकारों के डेटा को रनटाइम पर आवश्यकता के अनुसार एक सुपरटाइप में परिवर्तित किया जा सकता है ताकि प्रोग्राम सही ढंग से चले। उदाहरण के लिए, निम्नलिखित कानूनी सी भाषा कोड हैः डबल डी; लंबा एल; इंट आई; यदि (डी> आई) डी = आई; यदि (आई> एल) एल = आई; यदि (डी = = एल) डी * = 2; हालांकि, और विभिन्न डेटा प्रकारों से संबंधित हैं, तो वे हर बार तुलना या असाइनमेंट निष्पादित होने पर स्वचालित रूप से समान डेटा प्रकारों में परिवर्तित हो जाएंगे। इस व्यवहार का उपयोग सावधानी के साथ किया जाना चाहिए, क्योंकि अनपेक्षित परिणाम उत्पन्न हो सकते हैं। फ्लोटिंग-पॉइंट से पूर्णांक में प्रतिनिधित्वों को परिवर्तित करते समय डेटा खो सकता है, क्योंकि फ्लोटिंग-पॉइंट मानों के आंशिक घटकों को काट दिया जाएगा (शून्य की ओर गोल)। इसके विपरीत, पूर्णांक से फ्लोटिंग-पॉइंट में प्रतिनिधित्वों को परिवर्तित करते समय सटीकता खो सकती है, क्योंकि एक फ्लोटिंग-पॉइंट प्रकार कुछ पूर्णांक प्रकार के सभी संभावित मूल्यों का सटीक प्रतिनिधित्व करने में असमर्थ हो सकता है। उदाहरण के लिए, एक आई. ई. ई. ई. 754 एकल परिशुद्धता प्रकार हो सकता है, जो पूर्णांक 16777217 का सटीक प्रतिनिधित्व नहीं कर सकता है, जबकि एक 32-बिट पूर्णांक प्रकार कर सकता है। यह अविवेकी व्यवहार की ओर ले जा सकता है, जैसा कि निम्नलिखित कोड द्वारा प्रदर्शित किया गया हैः #include <stdio.h> int मुख्य (शून्य) {int i _ मान = 16777217; फ्लोट f _ मान = 16777216.0; प्रिंटएफ ("पूर्णांक हैः% d\n", i _ मान); प्रिंटएफ ("फ्लोट हैः% f\n", f _ मान); प्रिंटएफ ("उनकी समानताः% d\n", i _ मान = = f _ मान);} आई. ई. ई. ई. एकल परिशुद्धता के रूप में फ्लोट्स को लागू करने वाले संकलकों पर, और कम से कम 32 बिट्स के रूप में इंट, यह कोड इस विशिष्ट प्रिंट-आउट देगाः यह विषम व्यवहार फ्लोट में एक अंतर्निहित रूपांतरण के कारण होता है जब इसकी तुलना की जाती है। रूपांतरण सटीकता के नुकसान का कारण बनता है, जो तुलना से पहले मूल्यों को बराबर बनाता है। महत्वपूर्ण उपायः कटाई का कारण बनना, अर्थात, आंशिक भाग को हटाना। अंक को गोल करने का कारण बनता है। अतिरिक्त उच्च क्रम बिट्स के गिरने का कारण बनता है। प्रकार संवर्धन अंतर्निहित प्रकार रूपांतरण का एक विशेष मामला प्रकार संवर्धन है, जहां एक वस्तु स्वचालित रूप से मूल प्रकार के सुपरसेट का प्रतिनिधित्व करने वाले दूसरे डेटा प्रकार में परिवर्तित हो जाती है। पदोन्नति का उपयोग आमतौर पर लक्ष्य मंच की अंकगणितीय तर्क इकाई (ए. एल. यू.) के मूल प्रकार से छोटे प्रकारों के साथ किया जाता है, अंकगणितीय और तार्किक संचालन से पहले, इस तरह के संचालन को संभव बनाने के लिए, या अधिक कुशल यदि ए. एल. यू. एक से अधिक प्रकार के साथ काम कर सकता है। सी और सी + + बूलियन, वर्ण, विस्तृत वर्ण, गणना और लघु पूर्णांक प्रकार की वस्तुओं के लिए इस तरह का प्रचार करते हैं जिन्हें इंट में बढ़ावा दिया जाता है, और फ्लोट प्रकार की वस्तुओं के लिए, जिन्हें डबल में बढ़ावा दिया जाता है। कुछ अन्य प्रकार के रूपांतरणों के विपरीत, प्रचार कभी भी सटीकता नहीं खोते हैं या वस्तु में संग्रहीत मूल्य को संशोधित नहीं करते हैं। जावायावः int x = 3; डबल y = 3.5; System.out.println (x + y);// आउटपुट 6.5 स्पष्ट रोखोमनि सोलायसोल 'जागोन। यह कार्यक्रम में उपयोगकर्ता द्वारा अनुरोध किया जाता है। डबल दा = 3.3; डबल डी बी = 3.3; डबल डी सी = 3.4; इंट परिणाम = (इंट) दा + (इंट) डी बी + (इंट) डी सी;// परिणाम = = 9// यदि अंतर्निहित रूपांतरण का उपयोग किया जाएगा (जैसा कि "परिणाम = दा + डी बी + डी सी" के साथ), परिणाम 10 के बराबर होगा कई प्रकार के स्पष्ट रूपांतरण हैं। रूपांतरण किए जाने से पहले जाँच की जाती है, यह देखने के लिए एक रनटाइम जाँच की जाती है कि क्या गंतव्य प्रकार स्रोत मूल्य को धारण कर सकता है। यदि नहीं, तो एक त्रुटि की स्थिति उत्पन्न हो जाती है। अनियंत्रित कोई जाँच नहीं की जाती है। यदि गंतव्य प्रकार स्रोत मूल्य को धारण नहीं कर सकता है, तो परिणाम अनिर्धारित है। बिट पैटर्न स्रोत के कच्चे बिट प्रतिनिधित्व को शब्दशः नकल किया जाता है, और इसे गंतव्य प्रकार के अनुसार फिर से व्याख्या की जाती है। यह अलियासिंग के माध्यम से भी प्राप्त किया जा सकता है। ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग भाषाओं में, वस्तुओं को डाउनकास्ट भी किया जा सकता हैः एक आधार वर्ग का संदर्भ इसके व्युत्पन्न वर्गों में से एक में डाला जाता है। सी #और सी + + सी #में, प्रकार परिवर्तन एक सुरक्षित या असुरक्षित (यानी, सी-जैसे) तरीके से किया जा सकता है, जिसे पूर्व में चेक्ड टाइप कास्ट कहा जाता है। पशु जानवर = नई बिल्ली (); बुलडॉग बी = (बुलडॉग) जानवर;// यदि (जानवर बुलडॉग है), stat.type (जानवर) बुलडॉग है, तो एक अपवाद बी = बुलडॉग के रूप में जानवर;// यदि (जानवर बुलडॉग है), बी = (बुलडॉग) जानवर, अन्यथा बी = शून्य जानवर = शून्य; बी = बुलडॉग के रूप में जानवर;// बी = = शून्य सी + + में इसी तरह का प्रभाव सी + +-शैली कास्ट वाक्यविन्यास का उपयोग करके प्राप्त किया जा सकता है। एनिमल * एनिमल = न्यू कैट; बुलडॉग * बी = स्टैटिक _ कास्ट <बुलडॉग *> (एनिमल);// केवल तभी संकलित होता है जब एनिमल या बुलडॉग में से कोई एक दूसरे (या समान) बी = डायनेमिक _ कास्ट <बुलडॉग *> (एनिमल) से व्युत्पन्न होता है;// यदि (एनिमल बुलडॉग है), बी = (बुलडॉग) एनिमल, अन्यथा बी = नलप्ट्र बुलडॉग & बीआर = स्टैटिक _ कास्ट <बुलडॉग &> (एनिमल);// उपरोक्त के समान है, लेकिन एक अपवाद फेंक दिया जाएगा यदि एक नलप्ट्र वापस किया जाना था// यह कोड में नहीं देखा जाता है जहां अपवाद हैंडलिंग से जानवर को हटाने से बचा जाता है;// हमेशा मुक्त संसाधन एनिमल = नलप्ट्र; बी = डायनेमिक _ कास्ट <बुलडॉग असाइनमेंट नियम कहता है कि एक असाइनमेंट, जैसे किः x: = y मान्य है और केवल तभी जब इसकी स्रोत अभिव्यक्ति का प्रकार, इस मामले में y, अपनी लक्ष्य इकाई के प्रकार के साथ संगत है, इस मामले में x। इस नियम में, इसके साथ संगत होने का अर्थ है कि स्रोत अभिव्यक्ति का प्रकार या तो लक्ष्य के अनुरूप होता है या परिवर्तित हो जाता है। प्रकारों के अनुरूपता को ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग में बहुरूपता के लिए परिचित नियमों द्वारा परिभाषित किया जाता है। उदाहरण के लिए, उपरोक्त असाइनमेंट में, y का प्रकार x के प्रकार के अनुरूप है यदि वह वर्ग जिस पर y आधारित है, वह उस वर्ग का वंशज है जिस पर x आधारित है। एफिल में प्रकार परिवर्तन की परिभाषा एफिल में प्रकार परिवर्तन की क्रियाएं, विशेष रूप से परिवर्तित होती हैं और से परिवर्तित होती हैं, जिन्हें इस प्रकार परिभाषित किया गया हैः एक वर्ग सी. यू. पर आधारित एक प्रकार एक वर्ग सी. टी. पर आधारित एक प्रकार टी. में परिवर्तित हो जाता है (और टी. यू. से परिवर्तित हो जाता है) यदि सी. टी. में यू. को एक रूपांतरण प्रकार के रूप में उपयोग करते हुए एक रूपांतरण प्रक्रिया है, या सी. यू. में टी. को एक रूपांतरण प्रकार के रूप में सूचीबद्ध करने वाली एक रूपांतरण क्वेरी है, उदाहरण एफिल माइक्रोसॉफ्ट. नेट फ्रेमवर्क के लिए पूरी तरह से अनुपालन करने वाली भाषा है। . NET के विकास से पहले, एफिल में पहले से ही व्यापक वर्ग पुस्तकालय थे। . NET प्रकार के पुस्तकालयों का उपयोग करना, विशेष रूप से आमतौर पर उपयोग किए जाने वाले प्रकार जैसे स्ट्रिंग्स के साथ, एक रूपांतरण समस्या पैदा करता है। मौजूदा एफिल सॉफ्टवेयर एफिल पुस्तकालयों से स्ट्रिंग वर्गों (जैसे स्ट्रिं _ 8) का उपयोग करता है, लेकिन. NET के लिए लिखे गए एफिल सॉफ्टवेयर को कई मामलों में. NET स्ट्रिंग वर्ग (System.String) का उपयोग करना चाहिए, उदाहरण के लिए. NET विधियों को कॉल करते समय जो. NET प्रकार की वस्तुओं को तर्क के रूप में पारित होने की उम्मीद करते हैं। इसलिए, इन प्रकारों का आगे-पीछे रूपांतरण यथासंभव निर्बाध होना चाहिए। माय _ स्ट्रिंगः स्ट्रिंग _ 8-- नेटिव एफिल स्ट्रिंग माय _ सिस्टम _ स्ट्रिंगः सिस्टम _ स्ट्रिंग-- नेटिव. नेट स्ट्रिंग. माय _ स्ट्रिंगः = माय _ सिस्टम _ स्ट्रिंग उपरोक्त कोड में, दो स्ट्रिंग घोषित किए गए हैं, प्रत्येक अलग-अलग प्रकार में से एक (सिस्टम _ स्ट्रिंग System.String के लिए एफिल अनुरूप उपनाम है)। क्योंकि System.String, STRING _ 8 के अनुरूप नहीं है, तो उपरोक्त असाइनमेंट केवल तभी मान्य है जब System.String, STRING _ 8 में परिवर्तित हो जाता है। एफिल वर्ग स्ट्रिं _ 8 में System.String प्रकार की वस्तुओं के लिए मेक _ फ्रॉम _ सिल की एक रूपांतरण प्रक्रिया है। रूपांतरण प्रक्रियाओं को भी हमेशा निर्माण प्रक्रियाओं (निर्माताओं के समान) के रूप में नामित किया जाता है। निम्नलिखित स्ट्रिंग _ 8 वर्ग का एक अंश हैः क्लास स्ट्रिंग _ 8. मेक _ फ्रॉम _ सिल बनाएँ. मेक _ फ्रॉम _ सिल ({SYSTEM _ STRING}) को परिवर्तित करें। रूपांतरण प्रक्रिया की उपस्थिति असाइनमेंट को बनाती हैः माय _ स्ट्रिंगः = माय _ सिस्टम _ स्ट्रिंग शब्दार्थ रूप से समतुल्य हैः क्रिएट my_string.make_from_cil (माय _ सिस्टम _ स्ट्रिंग) जिसमें माय _ स्ट्रिंग को माय _ सिस्टम _ स्ट्रिंग के समतुल्य सामग्री के साथ एसटीआरआईएनजी _ 8 प्रकार की एक नई वस्तु के रूप में बनाया गया है। मूल स्रोत और लक्ष्य के साथ एक असाइनमेंट को संभालने के लिए उल्टाः माय _ सिस्टम _ स्ट्रिंगः = माय _ स्ट्रिंग वर्ग एसटीआरआइएल में एक रूपांतरण क्वेरी भी शामिल है जो एसटीआरआइएल _ 8 के एक उदाहरण से एक System.String का उत्पादन करेगा। वर्ग स्ट्रिं _ 8. मेक _ फ्रॉम _ सिल बनाएँ। मेक _ फ्रॉम _ सिल ({SYSTEM _ STRING}) को _ सिलः {SYSTEM _ STRING} में परिवर्तित करें। असाइनमेंटः माय _ सिस्टम _ स्ट्रिंगः = माय _ स्ट्रिंग तब, इसके बराबर हो जाता हैः माय _ सिस्टम _ स्ट्रिंगः = my_string.to_cil एफिल में, प्रकार परिवर्तन के लिए सेटअप वर्ग कोड में शामिल है, लेकिन फिर क्लाइंट कोड में स्पष्ट प्रकार परिवर्तन के रूप में स्वचालित रूप से होता प्रतीत होता है। इसमें न केवल असाइनमेंट बल्कि अन्य प्रकार के संलग्नक भी शामिल हैं, जैसे कि तर्क (पैरामीटर) प्रतिस्थापन। रस्ट रस्ट आदिम प्रकारों के बीच कोई अंतर्निहित प्रकार रूपांतरण (जबरदस्ती) प्रदान नहीं करता है। लेकिन, स्पष्ट प्रकार रूपांतरण (कास्टिंग) को मुख्य शब्द के रूप में उपयोग करके किया जा सकता है। माना x = 1000; प्रिंटएलएन! ("1000 एक यू16 के रूप मेंः {}", एक्स यू16 के रूप में); अप्रकाशित संघों का उपयोग करके निहित कास्टिंग कई प्रोग्रामिंग भाषाएँ संघ प्रकारों का समर्थन करती हैं जो कई प्रकारों का मूल्य रख सकते हैं। अनटैग किए गए संघ कुछ भाषाओं में शिथिल प्रकार-जाँच के साथ प्रदान किए जाते हैं, जैसे कि सी और पीएल/आई, लेकिन मूल पास्कल में भी। इनका उपयोग एक प्रकार के बिट पैटर्न को दूसरे प्रकार के मूल्य के रूप में व्याख्या करने के लिए किया जा सकता है। सुरक्षा मुद्दे हैकिंग में, टाइपकास्टिंग एक चर के डेटा प्रकार को अस्थायी रूप से बदलने के लिए प्रकार रूपांतरण का दुरुपयोग है जिसे मूल रूप से परिभाषित किया गया था। यह हैकर्स के लिए अवसर प्रदान करता है क्योंकि टाइप रूपांतरण में एक चर के बाद "टाइपकास्ट" एक अलग डेटा प्रकार बन जाता है, संकलक उस हैक किए गए चर को उस विशिष्ट ऑपरेशन के लिए नए डेटा प्रकार के रूप में मानेगा। यह भी देखें डाउनकास्टिंग प्रकार पंनिंग संदर्भ बाहरी लिंक सी + + सी + + संदर्भ गाइड में अदा कास्टिंग में कास्टिंग मैं सी + + कास्ट ऑपरेटरों से क्यों नफरत करता हूं, डैनी कालेव द्वारा जावा में कास्टिंग सी #इम्प्लिसिट टाइप कास्टिंग में अंतर्निहित रूपांतरण सी + + अपकास्टिंग में स्थिर और पुनर्व्याख्या कास्टिंग और एफ #डेटा प्रकार ऑपरेटरों में डाउनकास्टिंग (प्रोग्रामिंग) प्रकार सिद्धांत अनरी ऑपरेशन