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

Java मध्ये टाइपकास्ट करत आहे

आदिम प्रकारांचे चल (प्रकार अपवाद वगळता boolean) विविध प्रकारच्या संख्या संग्रहित करण्यासाठी वापरले जातात. व्हेरिएबल्सचे प्रकार कधीही बदलले नसले तरी, अशी जागा आहे जिथे तुम्ही एका प्रकारातून दुसऱ्या प्रकारात रूपांतरित करू शकता. आणि ती जागा असाइनमेंट आहे .

वेगवेगळ्या प्रकारचे व्हेरिएबल्स एकमेकांना नियुक्त केले जाऊ शकतात. जेव्हा तुम्ही हे करता तेव्हा एका प्रकारच्या व्हेरिएबलचे मूल्य दुसर्‍या प्रकारच्या व्हेरिएबलमध्ये रूपांतरित केले जाते आणि दुसर्‍या व्हेरिएबलला नियुक्त केले जाते. या संदर्भात, आम्ही दोन प्रकारचे रूपांतरण ओळखू शकतो: रुंदीकरण आणि अरुंद करणे.

रुंदीकरण हे मूल्य लहान टोपलीतून मोठ्या आकारात हलवण्यासारखे आहे: हे ऑपरेशन अखंड आणि वेदनारहित आहे. जेव्हा तुम्ही मूल्य मोठ्या टोपलीतून एका लहान टोपलीत हलवता तेव्हा संकुचित होते: तेथे पुरेशी जागा नसू शकते आणि तुम्हाला काहीतरी फेकून द्यावे लागेल.

बास्केट आकारानुसार क्रमवारी लावलेले प्रकार येथे आहेत:

Java 2 मध्ये टाइपकास्ट करणे


2. प्रकार रूपांतरणे रुंद करणे

एका अंकीय प्रकाराचे व्हेरिएबल दुसर्‍या संख्यात्मक प्रकाराच्या व्हेरिएबलला नियुक्त करणे अनेकदा आवश्यक असते. तुम्ही ते कसे करता?

Java मध्ये 4 पूर्णांक प्रकार आहेत:

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

लहान बास्केटमध्ये संग्रहित व्हेरिएबल नेहमी मोठ्या बास्केटमध्ये संग्रहित व्हेरिएबलसाठी नियुक्त केले जाऊ शकतात.

int, shortआणि byteव्हेरिएबल्सला व्हेरिएबल्स सहजपणे नियुक्त केले जाऊ शकतात long. shortआणि byteव्हेरिएबल्सला व्हेरिएबल्स नियुक्त केले जाऊ शकतात int. आणि byteव्हेरिएबल्सला व्हेरिएबल्स नियुक्त केले जाऊ शकतात short.

उदाहरणे:

कोड वर्णन
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 बाइट्स. सफरचंद लहान टोपलीतून मोठ्या बास्केटमध्ये हस्तांतरित करणे ही समस्या नाही. परंतु मोठ्या टोपलीतून लहान टोपलीकडे जाताना, काही सफरचंद गमावले जाऊ शकतात.

हे परिवर्तन — मोठ्या प्रकारातून लहान प्रकारात — याला संकुचित प्रकार रूपांतरण म्हणतात . अशा प्रकारे असाइनमेंट ऑपरेशन करत असताना, संख्येचा काही भाग नवीन व्हेरिएबलमध्ये बसू शकत नाही आणि म्हणून टाकून दिला जाऊ शकतो.

एखादे प्रकार संकुचित करताना, आम्ही कंपायलरला स्पष्टपणे सांगणे आवश्यक आहे की आम्ही चूक करत नाही आहोत, आम्ही मुद्दाम क्रमांकाचा काही भाग टाकून देत आहोत. यासाठी टाइपकास्ट ऑपरेटरचा वापर केला जातो. हे कंसात एक प्रकारचे नाव आहे .

अशा परिस्थितीत, Java कंपाइलरला प्रोग्रामरला टाइपकास्ट ऑपरेटर निर्दिष्ट करणे आवश्यक आहे. सर्वसाधारणपणे, हे असे दिसते:

(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

एक दशलक्ष a longआणि a मध्ये उत्तम प्रकारे बसते int. परंतु व्हेरिएबलला एक दशलक्ष असाइन करताना short, पहिले दोन बाइट टाकून दिले जातात आणि फक्त शेवटचे दोन बाइट्स राखले जातात. आणि a ला नियुक्त करताना byte, फक्त शेवटची बाइट शिल्लक राहते.

मेमरीमध्ये क्रमांक कसे व्यवस्थित केले जातात:

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

charप्रकार

A char, a प्रमाणे short, दोन बाइट्स व्यापतात, परंतु एक दुसऱ्यामध्ये रूपांतरित करण्यासाठी, तुम्हाला नेहमी टाइपकास्ट ऑपरेटर वापरण्याची आवश्यकता असते. येथे समस्या अशी आहे की प्रकार स्वाक्षरी केलेला आहे आणि त्यात ते shortपासून मूल्ये असू शकतात , परंतु प्रकार स्वाक्षरी नसलेला आहे आणि त्यात ते पासून मूल्ये असू शकतात .-32,768+32,767char065,535

ऋण संख्या a मध्ये संग्रहित केली जाऊ शकत नाहीत char, परंतु त्या a मध्ये संग्रहित केल्या जाऊ शकतात short. आणि shortपेक्षा मोठी संख्या संचयित करू शकत नाही 32,767, परंतु अशा संख्या a मध्ये संग्रहित केल्या जाऊ शकतात char.


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

जर एकाच अभिव्यक्तीमध्ये भिन्न प्रकारची चल वापरली गेली तर? तार्किकदृष्ट्या, आम्ही समजतो की त्यांना प्रथम सामान्य प्रकारात रूपांतरित करणे आवश्यक आहे. पण कोणते?

मोठ्या, अर्थातच.

Java नेहमी मोठ्या प्रकारात रूपांतरित होते. ढोबळपणे सांगायचे तर, एक प्रकार प्रथम रुंद केला जातो आणि त्यानंतरच त्याच प्रकारच्या मूल्यांचा वापर करून ऑपरेशन केले जाते.

जर a intआणि a longअभिव्यक्तीमध्ये सामील असेल तर, चे मूल्य inta मध्ये रूपांतरित केले जाईल longआणि त्यानंतरच ऑपरेशन पुढे जाईल:

कोड वर्णन
int a = 1;
long b = 2;
long c = a + b;
aa पर्यंत रुंद केले जाईल longआणि नंतर जोडणी होईल.

फ्लोटिंग-पॉइंट संख्या

पूर्णांक आणि फ्लोटिंग-पॉइंट नंबर ( floatकिंवा double) अभिव्यक्तीमध्ये सामील असल्यास, पूर्णांक फ्लोटिंग-पॉइंट नंबर ( floatकिंवा double) मध्ये रूपांतरित केला जाईल आणि त्यानंतरच ऑपरेशन केले जाईल.

जर ऑपरेशनमध्ये a floatआणि a समाविष्ट असेल double, तर ते floata मध्ये रूपांतरित केले जाईल double. जे प्रत्यक्षात अपेक्षित आहे.

आश्चर्य

एकमेकांशी संवाद साधताना byte, shortआणि प्रकार charनेहमी मध्ये रूपांतरित केले जातात . प्रकार हा मानक पूर्णांक प्रकार मानला जाण्याचे intएक चांगले कारण आहे .int

तुम्ही bytea चा a ने गुणाकार केल्यास shortतुम्हाला एक मिळेल int. तुम्ही bytea चा a ने गुणाकार केल्यास byteतुम्हाला एक मिळेल int. byteतुम्ही a आणि 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नेहमी लगेच ints मध्ये रूपांतरित होतात. आणि याचा अर्थ असा की जर तुम्हाला गणनेचा परिणाम एखाद्या पेक्षा लहान असलेल्या व्हेरिएबलमध्ये संग्रहित करायचा असेल 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);
हा योग्य मार्ग आहे.

जर तुम्हाला संपूर्ण अभिव्यक्ती विशिष्ट प्रकारात रूपांतरित करायची असेल, आणि केवळ अभिव्यक्तीचा एक घटक नाही, तर संपूर्ण अभिव्यक्ती कंसात गुंडाळा आणि टाइपकास्ट ऑपरेटर समोर ठेवा.