تبدیل نوع متغیرها در زبان C چیست؟ تبدیل نوع(typecasting)، تبدیل یک نوع داده به نوع دیگر می باشد.همچنین با نام تبدیل داده(data conversion),یا تبدیل نوع(type conversion) خوانده می شوند.این مفهوم یکی از مفاهیمی است که در برنامه نویسی C معرفی شده است.
برنامه نویسی C دو نوع عمل تبدیل داده فراهم آورده است:
- تبدیل نوع ضمنی(implicit)
- تبدیل نوع صریح(explicit)
تبدیل نوع ضمنی
تبدیل نوع ضمنی به معنی تبدیل نوع داده بدون از دست دادن معنای اصلی آن است. این تبدیل نوع در زمانهایی مناسب است که بخواهیم نوع داده را بدون تغییر محسوس مقدار ذخیره شده در متغیر، تغییر دهیم.
هنگامی که مقداری را در نوع داده سازگار با آن کپی می کنیم، تبدیل نوع ضمنی به صورت خودکار انجام می شود. هنگام تبدیل، قوانین سختگیرانه مربوط به تبدیل اعمال می شود. اگر عملوندها دو نوع متفاوت داده باشند، آنگاه عملوندی که نوع داده پایین تری دارد، به صورت خودکار به نوع داده بالاتر تبدیل می شود. این نوع تبدیل داده را در مثال زیر مشاهده می کنید:
#include<stdio.h> int main(){ short a=10; //initializing variable of short data type int b; //declaring int variable b=a; //implicit type casting printf("%d\n",a); printf("%d\n",b); }
خروجی:
10 10
- در مثال داده شده، یک متغیر از نوع داده short int را اعلان و با مقدار 0 آغاز کرده ایم.
- در خط دوم، یک متغیر از نوع داده Int اعلان کرده ایم.
- در خط سوم،مقدار متغیر s را به متغیر b اختصاص داده ایم. در خط سوم، هنگامی که مقدار متغیر s که از نوع داده short int است در متغیر a از نوع int کپی می شود، تدیل نوع ضمنی رخ می دهد.
تبدیل کارکتر به int
مثال زیر که در آن یک کارکتر دیکد شده در ASCII با یک عدد صحیح جمع زده می شود را ملاحظه کنید:
#include <stdio.h> main() { int number = 1; char character = 'k'; /*ASCII value is 107 */ int sum; sum = number + character; printf("Value of sum : %d\n", sum ); }
خروجی:
Value of sum : 108
در اینجا، کامپایلر با تبدیل مقدار ‘k’ به ASCII قبل از انجام عمل جمع، تبدیل به نوع Integer را انجام داده است.
سلسله مراتب تبدیل حسابی
کامپایلر ابتدا با ارتقا یک کارکتر به یک integer، آغاز می کند. اگر عملوندها همچنان نوع داده متفاوت داشته باشند، آنگاه، مطابق با نمودار سلسله مراتبی زیر، به نوع داده های بالاترارتقا می یابند:
برای درک این مفهوم مثال زیر را ملاحظه کنید:
#include <stdio.h> main() { int num = 13; char c = 'k'; /* ASCII value is 107 */ float sum; sum = num + c; printf("sum = %f\n", sum );}
خروجی:
sum = 120.000000
اول از همه، متغیر c به integer تبدیل می شود، اما کامپایلرمتغیرهای num و c را به “float” تبدیل کرده و آنها را باهم جمع می زند تا نتیجه یک “float” باشد.
نکات مهم در مورد تبدیل های ضمنی
- تبدیل نوع ضمنی تبدیل نوع استاندارد نیز نامیده می شود. در تبدیل نوع ضمنی به هیچ کلیدواژه یا دستور خاصی نیاز نیست.
- تبدیل نوع داده کوچکتر به نوع داده بزرگتر به عنوان ارتقا نوع(type promotion) هم شناخته می شود. در مثال بالا، همچنین می توان گفت که مقدار s به نوع داده integer ارتقا یافته است.
- تبدیل نوع ضمنی همیشه همراه با نوع داده های سازگار رخ می دهد.
در مورد نوع داده هایی که با هم سازگار نیستند تبدیل نوع ضمنی انجام نمی پذیرد، مواردی مانند:
- تبدیل یک نوع float به یک نوع int قسمت اعشاری را بریده و بنابراین معنای عدد از دست می رود.
- تبدیل double به float اراقام را گرد می کند.
- تبدیل long int به int بیت های درجه بالای اضافی را کنار می گذارد.
در همه این موارد، هنگام تبدیل داده، محتوای متغیر معنی خودش را از دست می دهد. کامپایلر عموماً از دست رفتن معنی محتوای یک متغیر را هشدار می دهد.
برنامه نویسی C نوع دیگری از تبدیل نوع، یعنی تبدیل نوع صریح را گردآوری کرده است.
تبدیل نوع صریح
در تبدیل نوع ضمنی، نوع داده به صورت خودکار تبدیل می شود. سناریوهایی وجود دارد که در آنها مجبور هستیم تبدیل نوع را به کامپایلرتحمیل کنیم. فرض کنید یک متغیر با نام div داریم که حاصل تقسیم دو عملوند با نوع داده int را ذخیره می کند:
int result, var1=10, var2=3; result=var1/var2;
در این حالت، پس از انجام عمل تقسیم روی متغیرهای var1 و var2، نتیجه ذخیره شده در متغیر “result” در فرمت integer خواهد بود. هنگامی که این اتفاق رخ می دهد، مقدار ذخیره شده در متغیر “result” معنای خود را از دست می دهد زیرا این مقدار بخش کسری که معمولاً از تقسیم دو عدد بوجود می آید را لحاظ نمی کند.
برای تحمیل تبدیل نوع در چنین شرایطی، از تبدیل نوع صریح استفاده می کنیم.
به یک عملگر تبدیل نوع نیاز است. دستور زبان عمومی برای عملیات تبدیل نوع به صورت زیر است:
(type-name) expression
در این عبارت:
- type-name نوع داده استاندار در زبان ‘C’ است.
- Expression می تواند یک ثابت، متغیر یا یک عبارت باشد.
اجازه دهید کاربرد تبدیل نوع صریح در ‘C’ را با نوشتن یک برنامه نشان دهیم:
#include<stdio.h> int main() { float a = 1.2; //int b = a; //Compiler will throw an error for this int b = (int)a + 1; printf("Value of a is %f\n", a); printf("Value of b is %d\n",b); return 0; }
خروجی:
Value of a is 1.200000 Value of b is 2
- متغیر ‘a’ را از نوع float آغاز کرده ایم.
- سپس یک متغیر دیگر با نام ‘b’ از نوع integer را ایجاد کرده ایم. از آنجایی که متغیرهای a و b از نوع داده های متفاوتی هستند، ‘C’ اجازه استفاده از چنین عبارتی را نداده و پیغام خطا خواهد داد. در بعضی از نسخه های ‘C’، عبارت ارزیابی می شود اما نتیجه دلخواه بدست نمی آید.
- برای اجتناب از چنین شرایطی، متغیر ‘a’ از نوعfloat را تبدیل می کنیم. با استفاده از روش تبدیل نوع صریح، یک نوع داده float را با موفقیت به نوع داده Integer تبدیل می کنیم.
- متغیر ‘a’ که همچنان یک float است را چاپ می کنیم.
- بعد از تبدیل نوع، نتیجه ‘b’ همواره یک عدد صحیح خواهد بود.
تبدیل نوع صریح در برنامه نویسی C را می توان بدین شیوه انجام داد.
خلاصه تبدیل نوع متغیرها در زبان C
- تبدیل نوع(typecasting) همچنین type conversion نامیده می شود.
- تبدیل نوع، به معنی تبدیل یک نوع داده به نوع داده دیگر است.
- تبدیل نوع داده های کوچکتر به نوع داده های بزرگتر با عنوان ارتقا نوع هم خوانده می شود.
- زبان C روش های تبدیل نوع ضمنی و صریح را فراهم آورده است.
- تبدیل نوع ضمنی هنگام مشاهده نوع داده های سازگار، به صورت خودکار رخ می دهد.
- تبدیل نوع صریح به یک عملگر تبدیل نوع نیاز دارد.
قواعد زیر را درهنگام مواجه با نوع داده های مختلف و برای جلوگیری از هدررفتن داده در ذهن داشته باشید:
- نوع داده های integer باید به نوع float تبدیل شوند.
- نوع داده های float باید به نوع داده های double تبدیل شوند.
- نوع داده های کارکتر باید به integer تبدیل شوند.
اگر این نوشته برایتان مفید بود لطفا کامنت بنویسید.
مطلب مفیدی بود و بسیار عالی توضیح داده شده ممنون