कास्टिंग का क्या मतलब है?


18

जब सीआई जैसी निम्न स्तर की भाषाओं में कोडिंग होती है, तो यह पता चलता है कि कभी-कभी कास्टिंग का अर्थ है 'इन बाइट्स को फिर से समझना जैसे कि यह हमेशा इस प्रकार का था' और अन्य समय में 'इस मान को बुद्धिमानी से इस अन्य प्रकार में परिवर्तित करें'।

शब्द का मूल अर्थ क्या है और क्या किसी रूपांतरण की उम्मीद है और कब एक कच्ची पुनर्व्याख्या की अपेक्षा की जाती है?


विकिपीडिया लेख में क्या है जो आपको समझ में नहीं आता है? " टाइप रूपांतरण , टाइपकास्टिंग , और जबरदस्ती के अलग-अलग तरीके हैं, संक्षेप में या स्पष्ट रूप से, एक डेटा प्रकार की एक इकाई को दूसरे में बदलना ... प्रत्येक प्रोग्रामिंग भाषा के अपने नियम हैं कि कैसे प्रकार परिवर्तित किए जा सकते हैं ..."
gnat

"कास्ट" का मूल अर्थ प्रोग्रामिंग के साथ कमोंग में कुछ भी नहीं है, यहां देखें merriam-webster.com/dfox/cast
Doc Brown

1
कास्ट ऑपरेटर श्रेणी में एरिक लिपर्ट के ब्लॉग पर बहुत (एक प्रबंधित-भाषा के नजरिए से)
आकाशवाणी

1
@gnat: मुझे यकीन नहीं है कि यह एक गंभीर सवाल है या सिर्फ ट्रोलिंग का प्रयास है। लेकिन मैं जानना चाहूंगा कि कैसे पता चलेगा कि कंपाइलर क्या करेगा: कन्वर्ट, कास्ट या कॉर्स? अंगूठे के नियम क्या हैं?
अलेक्जेंडर टॉर्लिंग

1
@DocBrown मुझे लगता castहै कि कंप्यूटिंग अर्थों में शब्द धातु विज्ञान में कास्टिंग के समान है, जिससे पिघले हुए धातु के आकार को एक सांचे में डालने पर सुधार होता है: britannica.com/EBchecked/topic/377665/metestone/81884/Casting
KChaloux

जवाबों:


10

सी में कास्टिंग अन्य भाषाओं के विपरीत अद्वितीय है। यह कभी भी बुद्धिमान नहीं होता है।

सी में कास्टिंग ध्यान से परिभाषित नियमों का उपयोग करके मूल्यों को एक प्रकार से दूसरे प्रकार में परिवर्तित करता है। यदि आपको वास्तव में जानने की आवश्यकता है, तो मानक पढ़ें। अन्यथा मुख्य बिंदु हैं:

  1. यदि संभव हो तो पूर्णांक प्रकारों के बीच रूपांतरण मूल्य को संरक्षित करता है। यदि गंतव्य में अधिक बिट्स हैं तो यह चौड़ा और आम तौर पर सुरक्षित है, लेकिन इसमें साइन एक्सटेंशन शामिल हो सकता है। यदि संकरा, बिट्स खो जाएगा।
  2. पॉइंटर प्रकारों के बीच रूपांतरण पॉइंटर मान को संरक्षित करता है, लेकिन परिणाम अक्सर अपरिभाषित होते हैं, अक्सर गैर-पोर्टेबल और अक्सर उन्नत परिदृश्यों के लिए उपयोगी होते हैं।
  3. पूर्णांक प्रकारों और बिंदुओं के बीच रूपांतरण ठीक है यदि पूर्णांक बड़ा है, और बिट पैटर्न (जो भी मतलब हो सकता है) को संरक्षित करता है। यदि पूर्णांक बहुत छोटा है, तो परिणाम अपरिभाषित है लेकिन उपयोगी नहीं है। एक नियम के रूप में 'लंबा' 'शून्य *' के लिए पर्याप्त विस्तृत है, लेकिन कोई गारंटी नहीं है! इस तरह से बनाए गए पॉइंटर्स सभी प्रकार के दिलचस्प तरीकों से अमान्य हो सकते हैं।
  4. फ्लोट और पूर्णांक प्रकारों के बीच रूपांतरण एक उपयुक्त लाइब्रेरी रूटीन (ट्रंकेशन के साथ, गोल नहीं) द्वारा परिभाषित अंकगणितीय रूपांतरण हैं।
  5. आप शून्य करने के लिए फ़ंक्शन का रिटर्न मान डाल सकते हैं। मेरे पास कभी नहीं है। यह कुछ नहीं करता है।

कुछ कास्ट को स्पष्ट रूप से लागू किया जाता है, और उनमें से कुछ में कंपाइलर एक चेतावनी जारी करेगा। चेतावनी देने के लिए सबसे अच्छा!

कास्ट के लिए डिक्शनरी की परिभाषा को अनदेखा किया गया है, क्योंकि वह अनहेल्दी है। कई जातियों को शब्दों के रूपांतरण या ज़बरदस्ती के द्वारा बेहतर ढंग से वर्णित किया जाता है, इसलिए यह भी जानने योग्य है।

C ++ MUCH अधिक जटिल है, लेकिन आपने यह नहीं पूछा, क्या आपने?


मुझे अंगूठे के नियमों में दिलचस्पी है, ना कि मिनिस्कुल डिटेल पर, लेकिन मैं सी के अलावा अन्य भाषाओं में दिलचस्पी रखता हूं अगर इससे चीजें साफ करने में मदद मिलती है।
अलेक्जेंडर टॉर्लिंग

2
मैंने यहां जो दिया है वह उतना ही सामान्य है जितना कि उचित है। वास्तविक, निम्न स्तर के पेशेवर C / C ++ कोड को लिखने के लिए मिनीस्कूल का विवरण महत्वपूर्ण है। अधिकांश भाषाओं में उनके प्रकार के रूपांतरणों में इस तरह का मुद्दा नहीं होता है। क्षमा करें यदि यह आपकी समस्या का समाधान नहीं करता है।
david.pfx

सिवाय इसके कि से परिवर्तित T*करने के लिए void*और वापस हमेशा अच्छी तरह से परिभाषित है।
माइल्स राउत

@ मीलों: वास्तव में, टी * को किसी भी यू * और बैक में कनवर्ट करना मूल सूचक मान को संरक्षित करने के लिए आवश्यक है। अपने जवाब में मैंने केवल यह कहा था कि इसे छोटा रखने के लिए 'अक्सर अपरिभाषित' होता है, लेकिन कुछ विवरण बहुत ही गड़बड़ होते हैं।
david.pfx

1
@ सुपरकैट: n1570 S6.3.2.3 देखें। टी *, यू * और शून्य * के बीच परिवर्तित / गोल-ट्रिपिंग हमेशा सूचक को केवल एक अपवाद के साथ संरक्षित करता है। यदि कोई T * सही ढंग से संरेखित नहीं है, तो यह अपरिभाषित व्यवहार है। मैं आपकी बात स्वीकार करता हूं, लेकिन केवल उस हद तक।
david.pfx

2

वेबस्टर शब्दकोश का यह हिस्सा उचित परिभाषा देता है:

a: तरल या प्लास्टिक के रूप में एक सांचे में डालकर और दबाव के बिना कठोर बनाने के लिए (पदार्थ) को एक आकार देने के लिए
: इस प्रक्रिया द्वारा

इसलिए, कास्टिंग से पहले, आपकी "ऑब्जेक्ट" (शाब्दिक रूप से एक ओओपी ऑब्जेक्ट नहीं) एक दिए गए आकार (प्रकार) में है। जब आप इसे फिर से कास्ट करते हैं, तो इसे नए आकार में बनाने के लिए इसके चारों ओर "ठोस डालना" होता है, यही आप कास्टिंग के साथ करते हैं। आपके पास षट्भुज के आकार के पूर्णांक के रूप में एक संख्या है, और कास्टिंग के बाद, आपको एक आयत के आकार का स्ट्रिंग मिलेगा।


2
इसके अलावा : "(एक अभिनेता) को एक निश्चित भूमिका सौंपना"।
केली थॉमस

हाँ। मुझे यकीन है कि यह सबसे अच्छा है। +1।
david.pfx

2

सी कास्ट को दो समूहों में अलग करना उपयोगी हो सकता है:

  1. न्यूमेरिक कास्ट - मान को बनाए रखने का प्रयास करते हुए, एक संख्या को एक प्रतिनिधित्व के बीच दूसरे में परिवर्तित करते हैं। उदाहरण के लिए - (int)3.1होगा 3। सटीक मान निर्धारित नहीं किए जाने पर क्या होता है, इसके सटीक नियम हैं।

  2. पॉइंटर कास्ट्स - मेमोरी एड्रेस को रखें, लेकिन इसके डिफरेंस होने के तरीके को बदल दें। उदाहरण के लिए, के लिए float x=3.5, *(int *)&xदे देंगे 1080033280- इस पूर्णांक एक ही सा पैटर्न है कि नाव का प्रतिनिधित्व करता है का प्रतिनिधित्व करती है 3.5


Keep the memory address, but change the way it's dereferenced.टाइप-सस्पेंडेड पॉइंटर को डिफाइन करना परिभाषित नहीं है। मानक केवल & से कास्टिंग A *करने की गारंटी देता है , B *वही उत्पादन करेगा A *, जो 1 स्थान पर dereference के लिए मान्य नहीं हो सकता है - या यदि B *कोई है char *, तो इसका उपयोग किसी भी प्रकार के ऑब्जेक्ट प्रतिनिधित्व को पढ़ने के लिए किया जा सकता है। अन्य सभी प्रकारों के लिए, डेरेफ्रेंसिंग B *पॉइंटर टाइप-पिंगिंग, यूबी है, और सख्त अलियासिंग का उल्लंघन करता है। फिर भी, भले ही संकलक ने उपरोक्त उदाहरण 2 को इस कारण से रद्दी न किया हो, आप बिट पैटर्न के बारे में महत्वहीन धारणाएँ बना रहे हैं
अंडरस्कोर_ड

1
cast (v): to receive form in a mold

C ++ में विभिन्न प्रकार की जातियों को और अधिक स्पष्ट किया जा सकता है, reinterpret_castजिसका अर्थ है "इन बाइट्स का इलाज करना जैसे कि वे पहले से ही यह दूसरी चीज थे"। सी में आप एक का उपयोग करके यह बिल्कुल स्पष्ट कर सकते हैं union, (type)ऑपरेटर के साथ कास्टिंग परिणाम को संख्यात्मक रूप से बराबर रखने का प्रयास करेगा, सटीकता के नुकसान तक।


2
C पॉइंटर में जाति हमेशा पुनर्व्याख्या होती है और वैल्यू कास्ट हमेशा संभव के रूप में मूल्य को संरक्षित करते हैं। C ++ में पॉइंटर कास्ट करने के कई तरीके हैं, यही कारण है कि अधिक स्पष्ट कास्ट प्रकार हैं।
जान हुदेक जनवरी १14

C पॉइंटर-कास्ट शब्दार्थ आवश्यक नहीं कि "पुनर्व्याख्या" हो। यह एक प्रोसेसर के लिए वैध होगा जो शब्द पते का उपयोग करता था लेकिन int*एक शब्द के लिए बाइट-आधारित कोड के साथ अच्छी तरह से बातचीत करना चाहता था और एक char*शब्द था दो [एक शब्द के उच्च या निम्न बाइट का चयन करने वाला दूसरा बाइट]। एक कास्टिंग (int*)करने (char*)के लिए एक अतिरिक्त शब्द के अतिरिक्त की आवश्यकता होगी जो कि होना चाहिए जो कुछ भी होना चाहिए पहले बाइट को निर्दिष्ट करेगा int
सुपरकैट
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.