جاوا انواع دادههای مختلفی را ارائه میکند (مانند تقریباً هر زبان پویا دیگری) مانند boolean، char، int، unsigned int، signed int، float، double، long و … و در مجموع ۷ نوع، که در آن هر نوع داده فضای متفاوتی را در حین ذخیره در حافظه به دست میآورد. وقتی مقداری از یک نوع داده را به دیگری اختصاص می دهید، ممکن است این دو نوع با یکدیگر سازگار نباشند. اگر انواع دادهها با هم سازگار باشند، جاوا تبدیل را بهطور خودکار انجام میدهد که به عنوان تبدیل خودکار نوع شناخته میشود، و در غیر این صورت، باید به طور صریح تبدیل شوند. مثل اختصاص یک مقدار int به یک متغیر long.
آموزش مرتبط: آموزش جاوا
نوع داده | مقدار بیتی که در حافظه اشغال می شود |
---|---|
boolean | 1 |
byte | 8 (1 byte) |
char | 16 (2 bytes) |
short | 16(2 bytes) |
int | 32 (4 bytes) |
long | 64 (8 bytes) |
float | 32 (4 bytes) |
double | 64 (8 bytes) |
گسترش یا تبدیل خودکار نوع
تبدیل گسترده زمانی صورت می گیرد که دو نوع داده به طور خودکار تبدیل شوند. این زمانی اتفاق می افتد که:
- این دو نوع داده با هم سازگار هستند.
- وقتی مقدار یک نوع داده کوچکتر را به یک نوع داده بزرگتر اختصاص می دهیم.
به عنوان مثال، در جاوا، انواع داده های عددی با یکدیگر سازگار هستند، اما هیچ تبدیل خودکار از نوع عددی به char یا boolean پشتیبانی نمی شود. همچنین char و boolean با یکدیگر سازگار نیستند.
// کد جاوا برای نمایش تبدیل اتوماتیک
// Main class
class BKEB{
public static void main(String[] args)
{
int i = 100;
// تبدیل نوع اتوماتیک
// تبدیل Integer -> long
long l = i;
// تبدیل نوع اتوماتیک
// long -> float
float f = l;
// چاپ مقادیر
System.out.println("Int value " + i);
System.out.println("Long value " + l);
System.out.println("Float value " + f);
}
}
خروجی:
Int value 100
Long value 100
Float value 100.0
تبدیل محدود یا صریح
اگر بخواهیم مقدار یک نوع داده بزرگتر را به یک نوع داده کوچکتر اختصاص دهیم، عملیات تبدیل یا محدود کردن نوع صریح را انجام می دهیم.
- این برای انواع داده های ناسازگار که در آن تبدیل خودکار نمی تواند انجام شود مفید است.
- در اینجا نوع داده هدف، نوع مورد نظر برای تبدیل مقدار مشخص شده را مشخص می کند.
کاراکتر و عدد با هم سازگار نیستند. بیایید ببینیم زمانی که می خواهیم یکی را به دیگری تبدیل کنیم چه اتفاقی رخ می دهد.
// کد جاوا برای مشاهده انواع داده ناسازگار
// برای تبدیل صریح
public class BKEB{
public static void main(String[] argv)
{
// تعریف یک متغیر char
char ch = 'c';
// تعریف یک متغیر صحیح
int num = 88;
// تلاش برای قرار دادن متغیر عدد صحیح در متغیر کاراکتر
ch = num;
}
}
خروجی: یک خطا ایجاد خواهد شد
این خطا به این دلیل ایجاد می شود که یک متغیر عدد صحیح 4 بایت حجم دارد، در حالی که نوع داده کاراکتر به 2 بایت نیاز دارد. ما سعی می کنیم داده ها را از 4 بایت به 2 بایت رسم کنیم که امکان پذیر نیست.
چگونه تبدیل صریح انجام دهیم؟
برای انجام تبدیل صریح، نوع داده مقصد را در یک پرانتز قبل از متغیر مبدأ می نویسیم. مثلاً اگر بخواهیم یک داده double را به یک داده long یا int تبدیل صریح کنیم به شکل زیر عمل می کنیم.
//کد جاوا برای مشاهد تبدیل صریح داده
public class BKEB{
public static void main(String[] args)
{
double d = 100.04;
// تبدیل داده نوع صریح با دریافت اجباری دادهها از نوع داده long به نوع int
long l = (long)d;
// تبدیل داده صریح
int i = (int)l;
System.out.println("Double value " + d);
// در حین چاپ، شاهد گم شدن آن قسمت کسری خواهیم بود
System.out.println("Long value " + l);
//در حین چاپ، شاهد گم شدن آن قسمت کسری خواهیم بود
System.out.println("Int value " + i);
}
}
خروجی:
Double value 100.04
Long value 100
Int value 100
توجه: در هنگام اختصاص دادن مقدار به نوع بایت، بخش کسری از بین می رود و به مدول 256 (محدوده بایت) کاهش می یابد.
مثال
// کد جاوا برای نمایش تبدیل نوع داده صحیح و double به بایت
class BKEB{
public static void main(String args[])
{
// تعریف متغیر byte
byte b;
// تعریف و مقداردهی اولیه اعداد صحیح و دوبل
int i = 257;
double d = 323.142;
System.out.println("Conversion of int to byte.");
// i % 256
b = (byte)i;
System.out.println("i = " + i + " b = " + b);
System.out.println(
"\nConversion of double to byte.");
// d % 256
b = (byte)d;
System.out.println("d = " + d + " b= " + b);
}
}
خروجی
Conversion of int to byte.
i = 257 b = 1
Conversion of double to byte.
d = 323.142 b= 67
ارتقاء نوع داده در محاسبات
در حین محاسبات بین داده ها، ممکن است مقدار داده خروجی از محاسبات، از محدوده عملوندها فراتر رود و از این رو نوع داده خروجی ارتقا می یابد. برخی از شرایط برای ارتقای نوع عبارتند از:
- جاوا هنگام ارزیابی یک عبارت به طور خودکار هر عملوند byte، short یا char را به int ارتقا می دهد.
- اگر یک عملوند long، float یا double باشد، کل عبارت به ترتیب به long، float یا double ارتقا می یابد.
مثال:
//کد جاوا برای نمایش ارتقاء نوع داده در محاسبات
class BKEB{
public static void main(String args[])
{
// تعریف و مقداردهی اولیه انواع داده اولیه
byte b = 42;
char c = 'a';
short s = 1024;
int i = 50000;
float f = 5.67f;
double d = .1234;
// محاسبه مورد نظر
double result = (f * b) + (i / c) - (d * s);
// چاپ نتیجه به دست آمده پس از انجام تمام ارتقاء ها
System.out.println("result = " + result);
}
}
خروجی
result = 626.7784146484375
تبدیل نوع صریح در محاسبات
هنگام انجام محاسبات، نتیجه به طور خودکار به یک نوع داده بزرگتر از عملوند به روز می شود. اما اگر آن نتیجه را در هر نوع داده کوچکتری ذخیره کنیم، یک خطای زمان کامپایل ایجاد می کند، به همین دلیل باید نوع داده نتیجه را تبدیل صریح کنیم.
مثال:
// کد جاوا برای نمایش تبدیل نوع داده از عدد صحیح به byte
class BKEB{
public static void main(String args[])
{
// تعریف متغیر byte
byte b = 50;
// تبدیل نوع int به byte
b = (byte)(b * 2);
System.out.println(b);
}
}
خروجی
100
نکته: در مورد عملوندهای منفرد، نتیجه به int تبدیل میشود و بر اساس آن، مانند مثال بالا، نوع آن تبدیل صریح میشود.
دیدگاهها