تبدیل انواع داده

توصیه می کنیم قبل از شروع این درس ابتدا دو مطلب زیر را بخوانید :

در کاتلین، انواع عددی نمی توانند به طور خودکار یا ضمنی به هم تبدیل شوند. مثلا در جاوا کد زیر قابل قبول است:

byte number1 = 5;

int number2 = number1;

در کد بالا نوع byte به نوع int تبدیل و این کار به صورت خودکار توسط کامپایلر انجام می شود. حال اگر همین کد را در کاتلین پیاده سازی کنیم با خطا مواجه می شویم :

val number1: Byte = 5

val number2: Int = number1

برای تبدیل یک نوع به نوع دیگر باید صریحا نوع داده ای که قرار است تبدیل شود را مشخص کنیم و این کار با استفاده از توابعی در کاتلین امکان پذیر است که در جدول زیر به آنها اشاره شده است:

تابع کاربرد
()toByte مقدار یک متغیر را به نوع Byte تبدیل می کند.
()toChar مقدار یک متغیر را به نوع Char تبدیل می کند.
()toFloat مقدار یک متغیر را به نوع Float تبدیل می کند.
()toInt مقدار یک متغیر را به نوع Int تبدیل می کند.
()toLong مقدار یک متغیر را به نوع Long تبدیل می کند.
()toShort مقدار یک متغیر را به نوع Short تبدیل می کند.
()toString مقدار یک متغیر را به نوع String تبدیل می کند.

با وجود این توابع تبدیل انواع داده به هم امکان پذیر است. در نتیجه کد کاتلین بالا به صورت زیر قابل انجام است:

fun main(args: Array<String>)
{
    val number1: Byte = 5
    val number2: Int = number1.toInt()

    print(number2)
}
5

در خط 2 کد بالا بعد از نام متغیر اول، علامت نقطه و نام تابع را ذکر کرده ایم. این بدین معناست که متغیر number1 را به نوع Int تبدیل کن و در داخل متغیر number2 قرار بده. در مثال نوع داده‌ای Byte می‌تواند مقادیر 0 تا 255 را در خود ذخیره کند و نوع داده‌ای int مقادیر 2147483648- تا 2147483647 را شامل می‌شود. پس می‌توانید بدون هیچ مشکلی یک متغیر از نوع Byte را به یک نوع Int تبدیل کنید. مقدار 5 متغیر number1 در محدوده مقادیر Byte یعنی اعداد بین 255-0 قرار دارد اما متغیری از نوع بایت حافظه کمتری نسبت به متغیری از نوع صحیح اشغال می‌کند. نوع Byte شامل 8 بیت یا 8 رقم دودویی است در حالی که نوع Int شامل 32 بیت یا رقم باینری است. یک عدد باینری عددی متشکل از 0 و 1 است. برای مثال عدد 5 در کامپیوتر به عدد باینری 101 ترجمه می‌شود. بنابراین وقتی ما عدد 5 را در یک متغیر از نوع بایت ذخیره می‌کنیم عددی به صورت زیر نمایش داده می‌شود :

00000101

و وقتی آن را در یک متغیر از نوع صحیح ذخیره می‌کنیم به صورت زیر نمایش داده می‌شود :

00000000000000000000000000000101

بنابراین قرار دادن یک مقدار Int، در یک متغیر Byte، درست مانند این است که ما سعی کنیم که یک توپ فوتبال را در یک سوراخ کوچک گلف جای دهیم. حال به مثال زیر توجه کنید :

fun main(args: Array<String>)
{
    val number1: Int = 300
    val number2: Byte = number1.toByte()
    
    print(number2)
}
44

در کد بالا یک number1 یک نوع صحیح با مقدار 300 است که آن را با استفاده از تابع ()toByte به نوع Byte تبدیل کرده و در متغیر number2 قرار داده ایم. پس چرا خروجی 44 است؟ دلیل آن این است که نوع Byte اعداد بین 255-0 را در خود ذخیره می کند و عدد 300 جز این محدود نیست. اما چرا عدد 44؟ این کار به تعداد بیتها بستگی دارد. یک Byte دارای 8 بیت است درحالی که Int دارای 32 بیت است. حال اگر به مقدار باینری 2 عدد توجه کنید متوجه می‌شوید که چرا خروجی عدد 44 است.

300 = 00000000000000000000000100101100 
255 =                         11111111
-------------------------------------- 
 44 =                         00101100

خروجی بالا نشان می‌دهد که بیشترین مقدار byte که عدد 255 است می‌تواند فقط شامل 8 بیت باشد (11111111) بنابراین فقط 8 بیت اول مقدار Int به متغیر Byte انتقال می‌یابد که شامل (00101100) یا عدد 44 در مبنای 10 است.