1. टाइपकास्टिंग

जावा में टाइपकास्टिंग

आदिम प्रकार के चर (प्रकार के अपवाद के साथ boolean) का उपयोग विभिन्न प्रकार की संख्याओं को संग्रहीत करने के लिए किया जाता है। हालाँकि चर के प्रकार कभी नहीं बदले, एक स्थान है जहाँ आप एक प्रकार से दूसरे में परिवर्तित कर सकते हैं। और वह जगह है असाइनमेंट

विभिन्न प्रकार के चर एक दूसरे को सौंपे जा सकते हैं। जब आप ऐसा करते हैं तो एक प्रकार के चर का मान दूसरे प्रकार के मान में परिवर्तित हो जाता है और दूसरे चर को सौंपा जाता है। इस संबंध में, हम दो प्रकार के रूपांतरणों की पहचान कर सकते हैं: चौड़ा करना और संकुचित करना।

चौड़ा करना एक मूल्य को एक छोटी टोकरी से एक बड़ी टोकरी में ले जाने जैसा है: यह ऑपरेशन निर्बाध और दर्द रहित है। संकीर्णता तब होती है जब आप किसी मूल्य को एक बड़ी टोकरी से एक छोटी टोकरी में ले जाते हैं: पर्याप्त जगह नहीं हो सकती है, और आपको कुछ दूर फेंकना होगा।

यहाँ प्रकार हैं, टोकरी के आकार के अनुसार क्रमबद्ध:

जावा 2 में टाइपकास्टिंग


2. व्यापक प्रकार के रूपांतरण

एक संख्यात्मक प्रकार के चर को दूसरे संख्यात्मक प्रकार के चर के लिए निर्दिष्ट करना अक्सर आवश्यक होता है। आप उसे कैसे करते हैं?

जावा में 4 पूर्णांक प्रकार हैं:

प्रकार आकार
byte 1 byte
short 2 bytes
int 4 bytes
long 8 bytes

छोटी टोकरियों में संग्रहीत चर को हमेशा बड़ी टोकरियों में संग्रहीत चरों को सौंपा जा सकता है।

int, shortऔर वेरिएबल्स को वेरिएबल्स byteको आसानी से असाइन किया जा सकता है । और वेरिएबल्स को वेरिएबल्स को असाइन किया जा सकता है । और चर को चर को सौंपा जा सकता है ।longshortbyteintbyteshort

उदाहरण:

कोड विवरण
byte a = 5;
short b = a;
int c = a + b;
long d = c * c;
यह कोड ठीक संकलित करेगा।

छोटे से बड़े प्रकार में इस तरह के रूपांतरण को व्यापक प्रकार का रूपांतरण कहा जाता है।

वास्तविक संख्याओं के बारे में क्या?

उनके साथ सब कुछ समान है - आकार मायने रखता है:

प्रकार आकार
float 4 bytes
double 8 bytes

floatdoubleचर को बिना किसी समस्या के चर को सौंपा जा सकता है । लेकिन पूर्णांक प्रकार के साथ चीजें अधिक दिलचस्प हैं।

आप किसी भी पूर्णांक चर को एक floatचर के लिए निर्दिष्ट कर सकते हैं। यहां तक ​​कि longप्रकार, जो 8 बाइट लंबा है। और आप जो चाहें असाइन कर सकते हैं - कोई भी पूर्णांक चर या floatचर - एक doubleचर के लिए:

कोड टिप्पणी
long a = 1234567890;
float b = a;
double c = a;

b == 1.23456794E9
c == 1.23456789E9

ध्यान दें कि पर्याप्त महत्वपूर्ण अंकों की कमी के कारण वास्तविक प्रकार में कनवर्ट करने से परिशुद्धता का नुकसान हो सकता है।

पूर्णांक से फ़्लोटिंग-पॉइंट नंबरों में कनवर्ट करते समय, संख्याओं के निचले क्रम के हिस्सों को छोड़ दिया जा सकता है। लेकिन चूंकि आंशिक संख्याओं को अनुमानित मानों को संग्रहित करने के लिए समझा जाता है, ऐसे असाइनमेंट ऑपरेशंस की अनुमति है।


3. संकीर्ण प्रकार के रूपांतरण

अन्य संभावनाओं के बारे में क्या? यदि आपको longएक intचर के लिए मान निर्दिष्ट करने की आवश्यकता है तो क्या होगा?

एक टोकरी के रूप में एक चर की कल्पना करो। हमारे पास विभिन्न आकारों के बास्केट हैं: 1, 2, 4 और 8 बाइट्स। सेब को छोटी टोकरी से बड़ी टोकरी में स्थानांतरित करना कोई समस्या नहीं है। लेकिन बड़ी टोकरी से छोटी टोकरी में जाने पर, कुछ सेब खो सकते हैं।

यह परिवर्तन - बड़े प्रकार से छोटे प्रकार में - एक संकीर्ण प्रकार रूपांतरण कहा जाता है । इस तरह एक असाइनमेंट ऑपरेशन करते समय, एक संख्या का हिस्सा नए चर में फिट नहीं हो सकता है और इसलिए उसे छोड़ दिया जा सकता है।

किसी प्रकार को संकुचित करते समय, हमें संकलक को स्पष्ट रूप से बताना चाहिए कि हम गलती नहीं कर रहे हैं, कि हम जानबूझकर संख्या का हिस्सा छोड़ रहे हैं। इसके लिए टाइपकास्ट ऑपरेटर का इस्तेमाल किया जाता है। यह कोष्ठक में एक प्रकार का नाम है ।

ऐसी स्थितियों में, जावा कंपाइलर को टाइपकास्ट ऑपरेटर निर्दिष्ट करने के लिए प्रोग्रामर की आवश्यकता होती है। सामान्य तौर पर, यह ऐसा दिखता है:

(type) expression

उदाहरण:

कोड विवरण
long a = 1;
int b = (int) a;
short c = (short) b;
byte d = (byte) c;
हर बार टाइपकास्ट ऑपरेटर को स्पष्ट रूप से इंगित किया जाना चाहिए

यहाँ aके बराबर है 1, और शायद टाइपकास्ट ऑपरेटर ओवरकिल जैसा लगता है। लेकिन क्या होगा अगर aबड़े थे?

कोड विवरण
long a = 1000000;
int b = (int) a;
short c = (short) b;
byte d = (byte) c;
a == 1000000
b == 1000000
c == 16960
d == 64

एक मिलियन पूरी तरह से एक longऔर एक में फिट बैठता है int। लेकिन एक shortचर के लिए एक मिलियन असाइन करते समय, पहले दो बाइट्स को छोड़ दिया जाता है, और केवल अंतिम दो बाइट्स को बरकरार रखा जाता है। और a को असाइन करते समय byte, केवल एक चीज जो बची रहती है वह है आखिरी बाइट।

स्मृति में संख्याओं को कैसे व्यवस्थित किया जाता है:

प्रकार बाइनरी नोटेशन दशमलव अंकन
int 0बी 00000000 00001111 01000010 01000000 1000000
short 0बी 01000010 01000000 16.960
byte 0बी 01000000 64

charप्रकार

A char, a की तरह short, दो बाइट्स लेता है, लेकिन एक को दूसरे में बदलने के लिए, आपको हमेशा टाइपकास्ट ऑपरेटर का उपयोग करने की आवश्यकता होती है। यहाँ मुद्दा यह है कि shortप्रकार पर हस्ताक्षर किए गए हैं और इसमें से मान शामिल हो सकते हैं -32,768, +32,767लेकिन charप्रकार अहस्ताक्षरित है और 0इसमें से मान शामिल हो सकते हैं 65,535

ऋणात्मक संख्याओं को a में संग्रहीत नहीं किया जा सकता है char, लेकिन उन्हें a में संग्रहीत किया जा सकता है short। और a shortसे बड़ी संख्याओं को संग्रहीत नहीं कर सकता है 32,767, लेकिन ऐसी संख्याओं को a में संग्रहीत किया जा सकता है char


4. एक अभिव्यक्ति का प्रकार

क्या होगा यदि एक ही अभिव्यक्ति में विभिन्न प्रकार के चर का उपयोग किया जाता है? तार्किक रूप से, हम समझते हैं कि उन्हें पहले एक सामान्य प्रकार में परिवर्तित करने की आवश्यकता है। पर कौनसा?

बड़े के लिए, बिल्कुल।

जावा हमेशा बड़े प्रकार में परिवर्तित होता है। मोटे तौर पर, पहले प्रकार में से एक को चौड़ा किया जाता है और उसके बाद ही उसी प्रकार के मूल्यों का उपयोग करके ऑपरेशन किया जाता है।

यदि a intऔर a longकिसी व्यंजक में शामिल हैं, तो वसीयत का मान inta में परिवर्तित हो जाएगा longऔर उसके बाद ही संक्रिया आगे बढ़ेगी:

कोड विवरण
int a = 1;
long b = 2;
long c = a + b;
aको चौड़ा किया जाएगा longऔर फिर जोड़ दिया जाएगा।

दशमलव संख्याएं

यदि एक पूर्णांक और एक फ़्लोटिंग-पॉइंट नंबर ( floatया double) एक अभिव्यक्ति में शामिल हैं, तो पूर्णांक को फ़्लोटिंग-पॉइंट नंबर ( floatया double) में बदल दिया जाएगा, और उसके बाद ही ऑपरेशन किया जाएगा।

यदि ऑपरेशन में a floatऔर a शामिल है double, तो इसे floata में परिवर्तित कर दिया जाएगा double। जो वास्तव में अपेक्षित है।

आश्चर्य

एक दूसरे के साथ बातचीत करते समय byte, short, और प्रकार charहमेशा रूपांतरित होते हैं । intएक अच्छा कारण है कि intप्रकार को मानक पूर्णांक प्रकार क्यों माना जाता है।

यदि आप a को bytea से गुणा करते हैं short, तो आपको एक मिलता है int। यदि आप a को bytea से गुणा करते हैं byte, तो आपको एक मिलता है int। यदि आप a byteऔर a जोड़ते हैं byte, तो भी आपको एक मिलता है int

इसके अनेक कारण हैं। उदाहरण:

कोड विवरण
byte a = 110;
byte b = 120;
byte c = a * b;  // Error
110 * 120है 13,200, जो प्रकार के अधिकतम मूल्य से थोड़ा अधिक है byte:127
byte a = 110;
byte b = 120;
byte c = a + b; // Error
110 + 120है 230, जो कि प्रकार के अधिकतम मूल्य से थोड़ा अधिक है byte:127

सामान्य तौर पर, 8-बिट (1 बाइट) संख्या को 8-बिट (1 बाइट) संख्या से गुणा करते समय, हमें एक संख्या मिलती है जो 16-बिट्स बिट्स (2 बाइट्स) पर कब्जा कर लेती है।

नतीजतन, पूर्णांक प्रकार वाले सभी ऑपरेशन जो इससे छोटे होते हैं, intहमेशा तुरंत intएस में परिवर्तित हो जाते हैं। और इसका मतलब यह है कि यदि आप गणना के परिणाम को एक प्रकार के चर में संग्रहीत करना चाहते हैं जो a से छोटा है int, तो आपको हमेशा टाइपकास्ट ऑपरेटर को स्पष्ट रूप से निर्दिष्ट करने की आवश्यकता होगी।

उदाहरण:

कोड विवरण
byte a = 110;
byte b = 120;
byte c = (byte) (a * b);
अभिव्यक्ति byte * byteएक होगीint
byte a = 110;
byte b = 120;
byte c = (byte) (a + b);
अभिव्यक्ति byte + byteएक होगीint
byte a = 1;
byte b = (byte) (a + 1);
अभिव्यक्ति byte + intएक होगी int
शाब्दिक एक एक है int

5. एक महत्वपूर्ण बारीकियाँ

टाइपकास्ट ऑपरेटर की काफी उच्च प्राथमिकता होती है।

इसका अर्थ यह है कि यदि किसी व्यंजक में, उदाहरण के लिए, जोड़ और एक टाइपकास्ट ऑपरेटर शामिल है, तो जोड़ने से पहले टाइपकास्ट किया जाएगा।

उदाहरण:

कोड विवरण
byte a = 1;
byte b = 2;
byte c = (byte) a * b;
टाइपकास्ट ऑपरेटर केवल aवेरिएबल पर लागू होगा, जो पहले से ही एक byte. यह कोड संकलित नहीं होगा।
byte a = 1;
byte b = 2;
byte c = (byte) (a * b);
यह सही तरीका है।

यदि आप संपूर्ण अभिव्यक्ति को एक विशिष्ट प्रकार में बदलना चाहते हैं, न कि अभिव्यक्ति के केवल एक घटक के लिए, तो संपूर्ण अभिव्यक्ति को कोष्ठक में लपेटें और टाइपकास्ट ऑपरेटर को सामने रखें।