மு.சிவலிங்கம் வலையகம்

சி-மொழிப் பாடங்கள்
 

பாடம்-8
சி-மொழியில் இனமாற்றங்கள்
(Type Conversions in C)

ஒரு புரோகிராமில் char, int, float, double ஆகிய தரவினங்களில் அறிவிக்கப்பட்ட மாறிகளில், ஓர் இனத்தின் மதிப்பை வேறோர் இனத்தின் மதிப்பாக எடுத்தாளும் முறையே இனமாற்றம் (Type Conversion) எனப்படுகிறது. சி-மொழியைப் பொறுத்தவரைப் புரோகிராமரின் தலையீட்டிலும், புரோகிராமரின் தலையீடு இல்லாமலும் இத்தகைய இனமாற்றம் சாத்தியம். சி-மொழியில் char மதிப்பை int மதிப்பாகவும், int மதிப்பை char மதிப்பாகவும், int மதிப்பை float அல்லது double-ஆகவும், float அல்லது double மதிப்புகளை int ஆகவும் மாற்றிக் கையாளலாம். இத்தகைய இனமாற்றம் இரண்டு வழிகளில் நடைபெறுகிறது:

(1) உட்கிடை இனமாற்றம் (Implicit Type Conversion)
(2) வெளிப்படை இனமாற்றம் (Explicit Type Conversion)

இந்த இருவகையான இனமாற்றங்களும் சி-மொழியில் எவ்வாறு நடைபெறுகின்றன என்பதை எடுத்துக்காட்டுகளுடன் பார்ப்போம்.

 உட்கிடை இனமாற்றம் (Implicit Type Conversion)

கம்ப்யூட்டர் புரோகிராம்களில் இனமாற்றம் என்பது அவ்வப்போது தேவைப்படும். குறிப்பாகக் கணக்கீடுகளில் இது தேவைப்படுகிறது. ஓரினத்தில் உருவாக்கப்பட்ட ஒரு மாறியின் மதிப்பை வேறோர் இன மதிப்போடு கணக்கீடுகளில் பயன்படுத்தும்போது இத்தகைய தேவை எழும். அதுபோன்ற தேவையை அறிந்து கொள்ள சில எடுத்துக்காட்டுகளைப் பார்ப்போம். கீழேயுள்ள புரோகிராமை எழுதி இயக்கிப் பாருங்கள்:

/* Program No. */
/* TYPECAS1.C */
#include <stdio.h>
main()
{
      int a=10, b=4;
      float c;
      c = a / b;
      printf("a=%d, b=%d, a/b=%3.1f", a, b, c);
}

இந்தப் புரோகிராமை இயக்கிப் பார்த்தால்,

a = 10, b = 4, a/b = 2.0

என்றுதான் விடை கிடைக்கும். ஏனெனில், a, b இரண்டும் int-ஆக இருப்பதால் a/b என்பதும் int-ஆகத்தான் இருக்கும். எனவே 2.0 தான் விடையாக வரும். 2.5 வராது. விடையை ஒரு float மாறியில் இருத்துவதாலேயே விடை 2.5 என்று ஆகிவிடாது. int மதிப்புகளில் செய்யப்படும் கணக்கீட்டின் விடை int மதிப்பாகவே இருக்கும் என்பது அறிக. மேற்கண்ட புரோகிராமைச் சிறிதே மாற்றுங்கள்:

/* Progarm No.2.4 */
/* TYPECAS2.C */
#include <stdio.h>
main()
{
      int a = 10;
      float b = 4, c;
      c = a / b;
      printf("a=%d, b=%1.0f, a/b=%3.1f", a, b, c);
}

இந்தப் புரோகிராம்,

a = 10, b = 4, a / b = 2.5

என்று காண்பிக்கும். float மதிப்புகளுக்கிடையே நடைபெறும் கணக்கீட்டின் விடைதானே float மதிப்பாக இருக்கும். இங்கே, b-யின் மதிப்பு float-ஆகவும், a-யின் மதிப்பு int-ஆகவும் இருந்தும் float மதிப்பு எவ்வாறு விடையாக வந்தது? மேலும் ஒரே இனத்தைச் சார்ந்த மதிப்புகளுக்கு இடையேதான் கணக்கீடு சாத்தியம். இங்கே ஓர் int மதிப்புக்கும், ஒரு float மதிப்புக்கும் இடையே வகுத்தல் எவ்வாறு சாத்தியமாயிற்று? இங்குதான் உட்கிடை இனமாற்றம் பங்கு வகிக்கிறது. c = a / b என்ற கணக்கீட்டில் c-யும், b-யும் float-ஆக இருப்பதால் a-யின் மதிப்பும் float-ஆக மாற்றப்பட்டு, விடையும் float மதிப்பாகவே கிடைத்துவிடுகிறது. ஏற்கெனவே நாம் பார்த்த AREA3.C புரோகிராமை இங்கே நினைவு கூருங்கள். அதில்

area = pai * radius * radius;

என்ற கட்டளை இடம் பெற்றுள்ளது. radius என்பது int இனமாக இருந்த போதிலும் pai என்பது float-ஆக இருப்பதால், radius என்பது float-ஆக மாற்றப்பட்டு அவற்றின் பெருக்குத் தொகையும் float இனமாகவே இருக்கும். எனவேதான் area என்பது float-ஆக அறிவிக்கப்பட்டுள்ளது. இவ்வாறு, இரண்டு தரவு இனங்களிடையே செய்யப்படும் கணக்கீட்டில், கீழ்நிலை இனம் மேல்நிலை இனமாகத் தாமாகவே மாற்றப்பட்டுவிடும். இந்த இனமாற்றத்தைக் கம்ப்பைலர் செய்கிறது. உட்கிடை இனமாற்றத்தில் இடம்பெறும் இனங்களின் தகுதி வரிசை int, long , float, double என்றவாறு அமையும். int, long-ஆக மாறி, விடை long-லேயே கிடைக்கும். அதுபோலவே int-ம் double-ம் மோதினாலும், float-ம் double-ம் மோதினாலும் விடை double-இல்தான் கிடைக்கும்.

இவ்வாறு சி-மொழிக் கணக்கீடுகளில் புரோகிராமரின் தலையீடு இல்லாமல் தாமாகவே (Implicitly) இனமாற்றம் நிகழ்கிறது. இந்த இனமாற்றம் தற்காலிகமானதே. கணக்கீட்டில் இனமாற்றம் அடையும் ஒரு மாறி தனது மூல இனத்தை இழப்பதில்லை. கணக்கீட்டிற்குப் பிறகு அது மூல இனத்திலேயேதான் நீடிக்கும்.

எண்வகை இனங்களுக்குள் நடைபெறும் உட்கிடை இனமாற்றம் போலவே சி-மொழியில் char இனத்துக்கும் int இனத்துக்கும் இடையிலும் உட்கிடை இனமாற்றம் சர்வ சாதாரணமாக நடைபெறுகிறது. எந்த அளவுக்கு என்றால் ஒரு குறிப்பிட்ட மதிப்பெல்லைக்குள் char இனத்தை int இனமாகவே கையாளும் அளவுக்கு இந்த இனமாற்றம் நடைபெறுகிறது. எப்படி எனப் பார்ப்போம்.

 char, int இரண்டும் ஓரினமா?

சி-மொழியில் char இனத்தை int இனமாகவும், int மதிப்பை char ஆகவும் கையாள முடியும். உங்கள் புரோகிராமில் ஓர் எண்வகை மாறியின் மதிப்பை -128 முதல் 127 வரைதான் கையாளுகிறீர்கள் எனில் அதனை int என்பதற்குப் பதிலாக signed char என அறிவித்துக் கொள்ளலாம். 0 முதல் 255 வரைதான் கையாளுகிறீர்கள் எனில், அதனை unsigned char என அறிவித்துக் கொள்ளலாம். அதேபோல char மதிப்புகளை int மதிப்புகளாகவே எடுத்தாள முடியும். அதாவது char இனம் மூலம் செய்து முடிக்க வேண்டிய வேலைகளை int இனம் மூலமாகவே சாதித்துக் கொள்ள முடியும். அதற்கு சி-மொழியின் உட்கிடை இனமாற்றம் துணைபுரிகிறது. இதன் காரணமாக “சி-மொழியைப் பொறுத்தவரை அனைத்துத் தரவினங்களும் எண்வகையைச் சார்ந்தவையே. எழுத்துவகை (கேரக்டர், ஸ்ட்ரிங்) இனங்களே கிடையாது” என்று கூறுவாரும் உண்டு.

int என்று அறிவிக்கப்பட்ட ஒரு மாறியை அதன் மதிப்பு -128 லிருந்து +127 வரை அல்லது 0 விலிருந்து 255 வரை இருக்கும் பட்சத்தில் அதனை char இனமாகவே கையாள முடியும் என்பதற்கு ஓர் எடுத்துக்காட்டுப் பார்ப்போம். கீழே உள்ள புரோகிராமைப் பாருங்கள்:

/* Program No.2.3 */
/* CHARINT2.C */
#include <stdio.h>
main()
{
      int alpha=65;
      printf("\nASCII value is %d", alpha);
      printf("\nASCII character is %c", alpha);
}

இந்தப் புரோகிராமைச் செயல்படுத்தினால்,

ASCII value is 65
ASCII character is A

என்று திரையில் காட்டும். இதில் குறிப்பிடத்தக்க செய்தி என்னவெனில், alpha என்ற int இன மாறியின் மதிப்பை %d என்ற குறியீட்டில் காண்பிக்கச் சொன்னால் 65 என்றும், %c என்ற குறியீட்டில் காண்பிக்கச் சொன்னால் A என்றும் காண்பிக்கிறது. A என்னும் ஆங்கில எழுத்தின் ஆஸ்க்கி மதிப்பு 65 என்பது நீங்கள் அறிந்ததே. இங்கே %c என்னும் வடிவமைப்புக் குறியீடே (format specifier) இனமாற்றத்தை நிகழ்த்தி விடுகிறது. கீழ்க்காணும் புரோகிராமையும் இயக்கிப் பாருங்கள்:

/* Program No.7 */
/* CHARINT3.C */
#include <stdio.h>
main()
{
      char alpha='A';
      printf("\nASCII character is %c", alpha);
      printf("\nASCII value is %d", alpha);
}

இந்த புரோகிராமைச் செயல்படுத்தினால்,

ASCII character is A
ASCII value is 65

என்று காட்டும். alpha என்னும் char இன மாறியின் மதிப்பை %c என்ற குறியீட்டில் A எனவும், %d என்ற குறியீட்டில் 65 எனவும் காட்டுகிறது. இன்னும் ஒரு புரோகிராமைப் பாருங்கள்:

/* Program No.2.*/
/* CHARINT1.C */
#include <stdio.h>
main()
{
      char alpha = 'A';
      char beta;
      beta = alpha + 1;
      printf("\nAlpha is %c", alpha);
      printf("\nBeta is %c", beta);
}

இந்தப் புரோகிராமைச் செயல்படுத்திப் பாருங்கள்.

Alpha is A
Beta is B

என்று மிகச் சரியாகவே காண்பிக்கும். முந்தைய புரோகிராமைவிட ஒரு படி மேலே போய் alpha என்ற கேரக்டர் மாறியில் உள்ள A என்னும் மதிப்பில் 1 என்னும் எண்ணை நேரடியாகக் கூட்ட முடிகிறது. beta = alpha + 1 என்ற கணக்கீட்டில் + என்னும் கணக்கீட்டுச் செயற்குறி (arithmatic operator) alpha என்னும் char மதிப்பை int மதிப்பாக இனம் மாற்றிக் கணக்கீட்டைச் செய்ய உதவுகிறது. அதேபோல், = என்னும் மதிப்பிருத்தல் செயற்குறி (assignmaent operator) ஓர் int மதிப்பை char மதிப்பாக இனம் மாற்றி, beta என்னும் char மாறியில் இருத்த உதவுகிறது. இந்த உட்கிடை இனமாற்றங்களைப் புரோகிராமரின் தலையீடின்றிக் கம்ப்பைலரே முன்னின்று செய்து முடிக்கிறது.

மேற்கண்ட புரோகிராம்களில் char மாறிகளில் கேரக்டர் மதிப்பையும் int மாறிகளில் இன்டிஜர் மதிப்பையும் இருத்தி வைத்து, கேரக்டராகவோ இன்டிஜராகவோ நம் விருப்பப்படி எடுத்தாள முடிந்தது. அடுத்து நம்முன் உள்ள கேள்வி, char மாறியில் இன்டிஜர் மதிப்பையும், int மாறியில் கேரக்டர் மதிப்பையும் இருத்தி வைத்துக் கையாள முடியுமா என்பதுதான். அப்படியும் முடியும் என்பதை அடுத்த புரோகிராமில் காண்க:

/* Program No. */
/* ALPBETA1.C */
#include <stdio.h>
main()
{
      int alpha = ‘A’;
      char beta = 66;
      printf(“int alpha = %d\n”, alpha);
      printf(“char alpha = %c\n”, alpha);
      printf(“int beta = %d\n”, beta);
      printf(“char beta = %c”, beta);
}

இந்தப் புரோகிராமின் வெளியீடு இவ்வாறு இருக்கும்:

int alpha = 65
char alpha = A
int beta = 66
char beta = B

இதிலும் உட்கிடை இனமாற்றங்களை இடம், பொருள், ஏவல் கருதிக் கம்ப்பைலர் உட்கிடை இனமாற்றங்களைச் செய்து முடிக்கிறது. char, int இனங்களுக்கு இடையே நடைபெறும் உட்கிடை இனமாற்றத்தின் உச்சத்துக்கு இன்னோர் எடுத்துக்காட்டைப் பாருங்கள்:

/* Program No */
/* ALPHBETA.C */
#include <stdio.h>
main()
{
      const char alpha = ‘A’, beta = ‘B’;
      int sum = alpha + beta;
      int product = alpha * beta;
      printf(“alpha = %c\n”, alpha);
      printf(“beta = %c\n”, beta);
      printf(“alpha + beta = %d\n”, sum);
      printf(“alpha * beta = %d”, product);
}

இந்தப் புரோகிராமின் வெளியீடு இவ்வாறு அமையும்:

alpha = A
beta = B
alpha + beta = 131
alpha * beta = 4290

கேரக்டர் இன மாறிகளை எண்களைப் போலக் கூட்டவும் பெருக்கவும் முடிகிறது. காரணம் உட்கிடை இனமாற்றம் என்னும் சிறப்புக் கூறே ஆகும். இங்கே உட்கிடை இனமாற்றம் நிகழ்த்தப்பட வேண்டும் என்பதைக் கணக்கீட்டுச் செயற்குறிகள் கம்ப்பைலருக்கு உணர்த்துகின்றன. எனவே மேற்கண்ட கணக்கீடுகள் சாத்தியமாகின்றன. உட்கிடை இனமாற்றத்தின் காரணமாய், எவ்வித ஃபங்ஷன்களின் துணையும் இல்லாமலேயே, ஓர் int மதிப்பை கேரக்டராகவும், ஒரு char மதிப்பை இன்டிஜராகவும் கையாள முடியும் என்பது சி-மொழியின் சிறப்புக் கூறாகும். இதன் காரணமாகவே ’சி-மொழி இன உணர்வு (type sensitive) அற்ற மொழி’ என்ற பழிச்சொல்லுக்கும் ஆளாகிறது.

இன்னொரு முக்கியமான விவரத்தை நீங்கள் மனதில் வைத்துக் கொள்ள வேண்டும். தரவினப் பாடத்தில் (பாடம்-5) கொடுக்கப்பட்டுள்ள அட்டவணையைக் கவனியுங்கள். char இனம் என்று அறிவிக்கப்படுகிற மாறி (variable) -128 லிருந்து +127 வரையுள்ள மதிப்புகளைத்தான் ஏற்றுக் கொள்ளும். நாம் மேலே பார்த்த புரோகிராம்களில் char என்று அறிவிக்கப்பட்டுள்ள மாறிகள் signed char வகையைச் சார்ந்தவைதான். டர்போ-சி-யைப் பொறுத்தவரை வெறுமனே char என்று குறிப்பிட்டால் signed char என்றே எடுத்துக் கொள்ளப்படும். ஆனால் char இன மாறியின் மதிப்பை 0 லிருந்து 255 வரை கையாள வேண்டும் என எண்ணினால் அந்த மாறியை unsigned char என்று அறிவிக்க வேண்டும்.

பொதுவாக, சி-மொழிப் புரோகிராமர்கள் தங்கள் புரோகிராம்களில் 0 முதல் 255-க்குள் பாஸிட்டிவ் இன்டிஜர் மதிப்புகளை மட்டுமே ஏற்கும் மாறிகளை unsigned char என்றே அறிவிப்பர். எடுத்துக்காட்டாக day, month போன்ற விவரங்களைக் கையாள, int இனத்தைவிட unsigned char இனமே மிகவும் பொறுத்தமானதாகும். காரணம் அவை முறையே 1 முதல் 31 வரை, 1 முதல் 12 வரை மதிப்புகளையே ஏற்கின்றன.

 வெளிப்படை இனமாற்றம் (Explicit Type Conversion)

மேற்கண்ட TYPECAS2.C புரோகிராமில் b என்ற மாறியை float-ஆக மாற்றியுள்ளோம். இவ்வாறு மாற்றாமல், a, b இரண்டையும் int ஆகவே வைத்துக் கொண்டு, விடையை மட்டும் float-ல் பெறவும் வழியுண்டு.

/* Program No. */
/* TYPECAS3.C */
#include <stdio.h>
main()
{
      int a=10, b = 4;
      float c;
      c = (float)a / b;
      printf("a = %d, b = %d, c = %3.1f", a, b, c);
}

இந்தப் புரோகிராமை இயக்கிப் பார்த்தால்,

a = 10, b = 4, c = 2.5

என்று விடையாகக் கிடைக்கும். இதில் a, b இரண்டும் int இனத்தைச் சார்ந்தவைதாம். c-யின் மதிப்பைக் கணக்கிடும்போது மட்டும் a என்ற மாறியைத் தற்காலிகமாக float என்று கருதிக் கொள்ளுமாறு வெளிப்படையாக (Explicitly) கட்டளை அமைத்துள்ளோம். a, float-ஆக இருப்பதால் b-யும் தாமாகவே float-ஆக மாற்றப்பட்டுவிடும். எனவே விடையும் float-ல் கிடைத்துவிடும். இவ்வாறு புரோகிராமர் தலையிட்டு வெளிப்படையாக இனமாற்றம் செய்யும் செயல்முறை இனமாற்றுகை (Typecasting) எனப்படுகிறது.

சில வேளைகளில் ஒரு float இன மதிப்பில் முழு எண் பகுதி (Integer portion) மட்டும் தேவைப்படுகிறது எனில், அதற்கும் வழியுள்ளது. கீழேயுள்ள புரோகிராமைக் கவனியுங்கள்:

/* Program No. */
/* TYPECAS4.C */
#include <stdio.h>
main()
{
      float x = 5.84;
      printf("\nValue of x : %4.2f", x);
      printf("\nInteger Portion: %d", (int)x);
}

இந்தப் புரோகிராமின் விடை 5 என்று காண்பிக்கும். இவ்வாறு ஒரு float மதிப்பில் உள்ள int மதிப்பை மட்டும் எடுத்தாள நமக்கு இனமாற்றம் (Type Casting) வழி வகுக்கிறது.

 Type Conversion Vs. Type Casting

Type Conversion, Type Casting இரண்டும் ஒன்றா? வேறு வேறா? வேறுபட்டவை எனில் இரண்டையும் வேறுபடுத்திக் காட்டுக. இவ்வாறெல்லாம் நேர்முகத் தேர்வுகளில் கேள்வி கேட்கப்படுவதுண்டு. இதற்குப் பதில் என்ன?

இரண்டும் சொல்தொடர்களுக்கும் வெவ்வேறு பொருள் என்பதில் ஐயமில்லை. ஆனால் கம்ப்யூட்டர் மொழிகளில் அதனை எவ்வாறு வேறுபடுத்திக் காட்டுவது என்பதில்தான் ஐயம் எழுகிறது. சில ஆசிரியர்கள் உட்கிடை இனமாற்றத்தை Type Conversion என்றும், வெளிப்படை இனமாற்றத்தை Type Casting என்றும் மிக எளிதாக விளக்கம் அளிக்கின்றனர். வேறுசில ஆசிரியர்கள் Type Casting என்பது காரணம் (cause), Type Conversion என்பது விளைவு (effect) எனவும் விளக்கம் அளிக்கின்றனர். இந்த இரண்டு வகையான விளக்கங்கங்களுள் மிகச் சரியானது எது?

ஆங்கிலச் சொற்களுக்கான நேரடியான பொருள் எதுவாக இருந்த போதிலும், கம்ப்யூட்டர் மொழிகளில் புரோகிராமர் வெளிப்படையாக இனமாற்றம் செய்யும் செயல்பாட்டையே Typecasting என்னும் சொல்லால் குறிப்பிடுகின்றனர். அச்செயல்பாட்டின் மூலம் Type Conversion என்னும் நிகழ்வு நிகழ்த்தப்படுகிறது. உட்கிடை இனமாற்றம், வெளிப்படை இனமாற்றம் இரண்டிலுமே இனமாற்றம் (Type Conversion) நிகழ்கிறது. முதலாவதில் இனமாற்றத்தைக் கம்ப்பைலர் நிகழ்த்துகிறது. இரண்டாவதில் புரோகிராமர் நிகழ்த்துகிறார். புரோகிராமர் நிகழ்த்தும் இனமாற்றமே (Type Coversion) Typecasting எனப்படுகிறது. எனவே மேற்கண்ட இரண்டு வகையான விளக்கங்களுள் இரண்டாவது விளக்கமே சரியானவை எனலாம்.

Type Conversion, Type Casting ஆகியவற்றுக்கு இணையாக நாம் பயன்படுத்தும் இனமாற்றம், இனமாற்றுகை என்னும் இரண்டு தமிழ்ச் சொற்களும் தாமாகவே இரண்டுக்கும் இடையேயான வேறுபாட்டை விளக்கி நிற்கின்றன.

இந்த வலையகத்தில்

இவ்வலையகத்தின் பக்கங்கள் இன்டர்நெட் எக்ஸ்புளோரர்-8, 1024 X 768 பிக்செல் திரைக்கேற்ப வடிவமைக்கப்பட்டுள்ளன
வலையக வடிவமைப்பு, உள்ளடக்கப் பதிப்புரிமை © 2009 மு.சிவலிங்கம்