آموزش قدم به قدم جاوا – قسمت پنجم

در این قسمت با مفهوم تبدیل داده‌ها آشنا خواهیم شد. مفهومی که در برنامه‌نویسی از آن زیاد استفاده می‌شود.

تبدیل نوع داده‌های اصلی (Primitive Type Conversion)

اجازه دهید این مبحث را با مثالی شروع کنیم. به کد زیر دقت کنید:

متغیری از جنس int با مقدار 10 تعریف کردیم. سپس متغیری از جنس float که برای نگهداری اعداد اعشاری استفاده می‌شود تعریف کردیم و مقدار متغیر i را درون آن قرار دادیم.

وقتی مقدار متغیر i که از نوع int است را به متغیر f که از نوع float است نسبت می‌دهیم به‌طور خودکار مقدار متغیر i به float تبدیل شده و درون آن قرار می‌گیرد. (توجه کنید که فقط مقدار متغیر i به نوع float تبدیل می‌شود نه خود متغیر) به این کار تبدیل خودکار نوع داده (Automatic type conversion) گفته می‌شود.

اما همیشه تبدیل خودکار نوع داده امکان‌پذیر نیست. در واقع برای انجام این کار باید دو شرط برقرار باشد:

1- دو نوع داده با هم سازگاری داشته باشند: مثلا واضح است که نمی‌توان مقداری از نوع boolean را به نوع float تبدیل کرد.

2- ظرفیت نوع داده مقصد باید بیشتر از ظرفیت نوع داده مبدا باشد: مثلا در این مثال ظرفیت یک متغیر از نوع float از ظرفیت یک متغیر از نوع int بزرگتر است یعنی مقدار یک متغیر از نوع int هر چقدر هم که بزرگ باشد می‌تواند در یک متغیر float قرار بگیرد.

به کد زیر توجه کنید:

همانطور که از قسمت نوع داده‌ها می‌دانید ظرفیت نوع داده double از float بیشتر است پس کد بالا بدون هیچ مشکلی اجرا خواهد شد و مقدار متغیر x به نوع double تبدیل شده و در متغیر y قرار خواهد گرفت. (حرف L در انتهای عددی که در کد نوشته شده برای مشخص کردن لیترال long است. اگر با لیترال‌ها آشنایی ندارید به قسمت دوم این مجموعه مراجعه کنید.)

اما اگر مثلا این کار را انجام دهیم:

واضح است که متغیری از نوع long گنجایش نگهداری عددی که در متغیر x ذخیره شده را ندارد اما علاوه بر این مسئله دیگری هم هست: همانطور که می‌دانید از متغیر‌های double برای نگهداری اعداد اعشاری نیز استفاده می‌شود. حالا اگر عدد اعشاری در x وجود داشته باشد چگونه می‌تواند در متغیری از جنس long که برای نگهداری اعداد صحیح به کار می‌رود ذخیره شود؟ بنابراین این برنامه با خطا مواجه خواهد شد.

تبدیل نوع داده‌های ناسازگار (Casting Incompatible Types)

آخرین کدی که نوشتیم قابل کامپایل و اجرا نبود به دلایلی که گفته شد. اما اگر قصد تبدیل داده‌های ناسازگار (مثلا تبدیل مقادیر اعشاری به غیراعشاری) را داشته باشیم چه باید کرد؟

به کد زیر دقت کنید:

درون مقدار x یک عدد اعشاری قرار گرفته است. در اینجا نمی‌توانیم از تبدیل خودکار استفاده کنیم و مستقیما مقدار x را درون int قرار دهیم چون متغیر y نمی‌تواند حاوی عدد اعشاری باشد. به پرانتزی که درون آن عبارت int نوشته شده توجه کنید: با این کار ما به کامپایلر دستور می‌دهیم که مقدار متغیر x را درون y قرار دهد اما در عوض به جای عدد 14.3 عدد 14 درون y قرار می‌گیرد و قسمت اعشاری آن از بین می‌رود. به این کار اصطلاحا Type Casting گفته می‌شود.

یا مثلا در کد زیر:

همانطور که می‌دانید ظرفیت نوع داده short از int کمتر است اما ما به کامپایلر دستور دادیم تا مقدار x را به short تبدیل کند. نتیجه این تبدیل از دست رفتن چند بیت از عددی که در متغیر x قرار گرفته است می‌باشد و در نتیجه عددی کوچک شده در متغیر y قرار خواهد گرفت.

 

مصطفی نصیری

دانشجوی نرم افزار هستم و علاقه شدیدی به برنامه نویسی مخصوصا با زبان جاوا دارم! در حال حاضر تمرکزم روی اندرویده. دوست دارم چیزایی که یاد میگیرم رو با بقیه به اشتراک بگذارم :)

همچنین ممکن است دوست داشته باشید ...

۶ واکنش

  1. علی گفت:

    منتظرم کمی جدی تر بشه
    ولی شما تو مسیر خودت حرکت کن
    موفق باشی

    • مصطفی نصیری گفت:

      اتفاقا داشتم به این فکر می کردم که شاید خوانندگان با خودشون بگن چرا هنوز به مباحث جدی تری مثل شی گرایی و این ها نرسیدیم
      اما هدف من اینه که تا حد امکان تمام جزییات رو بگم. برخلاف بعضی از آموزش ها که خیلی کلی مطالب رو میگن و سریع رد میشن.
      از شما هم ممنونم که من رو در این دوره همراهی می کنید
      موفق باشید

  2. علی گفت:

    من با روند گام به گام کامل موافقم.
    مثل تمام کتاب ها و آموزش های خارجی که می بینیم با حوصله ی تموم می شینن همه چی رو توضیح می دن.

  3. محمد علی خاصه پز گفت:

    با سلام بنده یک مشکل در بخش توضیح تبدیل نوع داده اصلی بخش تبدیل خودکار نوع داده (Automatic type conversion) مشاهده کردم شما درون بلاک کدتون در پایین نکته دوم از نوع Float استفاده نکردید ولی در توضیحات خودتون از Float اسم می برید و می گید “ظرفیت نوع داده double از float بیشتر است پس کد بالا بدون هیچ مشکلی اجرا خواهد شد” شما باید بجای float از کلمه long در بخش توضیحات کد استفاده کنید و یا در کد خودتون متغیر long رو درون double بریزید. پوزش فراوان می طلبم بخاطر جسارتم به نویسنده با سپاس از آموزش مفیدتون.

  4. محمد علی خاصه پز گفت:

    منظورم این بود که Float رو درون Double بریزید که به اشتباه گفتم long رو درون double بریزید

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *