Sunday 20 October 2013

Type Casting in C


Type Casting म्हणजे "Casting the type" अशी सोपी व्याख्या करता येइल. एका डेटा टाइप चे दुसऱ्या डेटा टाइप मध्ये conversion म्हणजे type casting म्हणता येइल. पण हा छोटासा concept,  प्रोग्रॅमिंग शिकतांना राहून जाण्याची शक्यता असते. पण खारूताई सारखा मदतीला धावून येणारा आहे म्हणून थोडे सविस्तर पद्धतीने सांगण्याचा प्रयत्न. 



खरं तर type casting नाही वापरले तर "compile time error" हा प्रसंग येत नसल्यामुळे हा दुर्लक्षीत रहात असावा...!

Type casting हे दोन प्रकारचे असते. 

  • एक म्हणजे implicit type casting जे compiler करतो 
  • व दुसरे म्हणजे explicit type casting जे programmer करतो. 

लहान मेमरी मधील value मोठ्ठ्या मेमरी मध्ये ठेवतांना information loss होण्याची शक्यता नसते. अशा वेळी implicit type casting करून compiler ने उद्योग केले तर फारसे नुकसान होत नाही. उदा: जर तुम्ही float x हे व्हेअरेबल declare केले व

x = 7;

असे लिहीले तरी 7 हा implicitly फ्लोट मध्ये convert केला जातो व स्टोअर केला जातो. किंवा 

x = 7.5 

असे statement जरी लिहीले तरी हे पुर्ण योग्य स्टेटमेंट नाही कारण by default 7.5 ही double value आहे जी 8 bytes घेते तर x ला 4 bytes आहेत. पण या ठिकाणी information loss ची जास्त भिती नाही. अर्थात हे स्टेटमेंट 

x = 7.5f 

असे लिहीणे तांत्रीक दृष्ठीने जास्त योग्य... हा सुद्धा एक type casting चाच प्रकार

पण जर x हे integer variable असले आणी जर float value ठेवली तर implicit cast मध्ये data overflow म्हणजेच information loss होते


Data Overflow


Explicit Typecasting  

समजा एका क्रिकेट प्लेअरच्या एका वन डे सेरीज मधील ५ मॅच मधील रन्स चे average score काढायचा आहे. सर्व साधारण पणे आपण total runs काढतो व नंतर average काढतो. 

आता प्रत्येक मॅच मध्ये काढलेल्या runs व total runs याचा डेटा टाइप integer असू शकतो. पण average मात्र real असू शकते. म्हणजेच

total = m1 + m2 + m3 + m4 + m5 ;
average = total / 5;

अशा प्रकारची स्टेटमेंट्स प्रोग्रॅम मध्ये आपण लिहीतो. 

या ठिकाणी total runs ५ किंवा १० च्या पटीत आल्या म्हणजेच multiple of 5 or 10 आल्या तर average मिळतांना अडचण येत नाही. म्हणजे समजा उदा: total 380, 395, 415, 425 अशा प्रकारची आली तर वरील average चा formula योग्य output (respectively 76.00, 79.00, 83.00, 85.00) देइल. पण समजा total 383, 397, 418, 426 अशी काही तरी आली तरी मार्क जास्त असून सुद्धा percentage तेच दाखवेल. 

याचे कारण म्हणजे total व 5 हे दोनही integers आहेत. व त्यांचा मध्ये झालेले operation integer च येते. या ठिकाणी आपल्याला तीन मार्ग उपलब्ध आहेत. पहीले दोन मार्ग सरधोपट आहेत. ते म्हणजे
  1. total variable चा data type सुद्धा float declare करायचा. (पण विनाकारण तुम्ही total ला ४ bytes मेमरी ऐसपैस पणे रहायला देत आहात)
  2. 5 ने भागायच्या ऐवजी 5.00 ने भागायचे. (हा good programming practice मध्ये मार्ग बसत नाही) 
  3. तिसरा मार्ग म्हणजे type casting करायचे. व वरील expression 

average = (float) total / 5;

असे लिहायचे. या ठिकाणी कंपायलरला आपण सांगत आहोत की total या व्हेअरेबल ला त्या एक्सप्रेशन पुरते float समज...फक्त समज आणी expression solve कर...!

Dynamic memory allocation करतांना सुद्धा C मध्ये malloc, calloc हि फंक्शन्स void pointer return करतात त्या ठिकाणी सुद्धा आपण योग्य त्या pointer ला type casting करून घेतो. 

अर्थात नंतर C++ मध्ये static_cast ही पद्धत वापरायला सुरवात झाली. C++ मध्ये वरील expression

average = static_cast <float> (total) / 5;

असे लिहीतात.

C++ मध्ये conversion functions, constructor, copy constructor in case of Inheritance या सर्व ठिकाणी pointer सुद्धा type cast करायला लागतो. C++ मध्ये virtual function (base to derived type casting) वापरतांना हिच type casting ची पद्धत intelligently exploit केली गेली त्यालाच आपण dynamic_cast, reinterpret_cast, const_cast असे अनेक विविध प्रकार शोधून काढले गेल्याचे पाहतोय.

C मध्ये 

atof( )..............String to float
atoi( )..............String to integer
atol( )..............String to long
itoa( )..............Integer to String
ltoa( )..............long int to String

अशा प्रकारची जी library functions आहेत ती type casting चा प्रकारच आहेत. 

dynamic_cast, static_cast, const_cast या विषयी नंतर कधीतरी मी सविस्तर लिहीन

No comments:

Post a Comment

Do you like the C Marathi e-learning concept?