تبدیل صریح

تبدیل صریح یا تبدیل کوچک کننده یا Narrowing Casting نوعی تبدیل است که برنامه را مجبور می‌کند که یک نوع داده را به نوعی دیگر تبدیل کند اگر این نوع تبدیل از طریق تبدیل ضمنی انجام نشود. در هنگام استفاده از این تبدیل باید دقت کرد چون در این نوع تبدیل ممکن است مقادیر اصلاح یا حذف شوند. ما می‌توانیم این عملیات را با استفاده از Cast انجام دهیم. Cast فقط نام دیگر تبدیل صریح است و دستور آن به صورت زیر است :

datatypeA variableA = value;
datatypeB variableB = (datatypeB)variableA;

همانطور که قبلاً مشاهده کردید نوع int را نتوانستیم به نوع byte تبدیل کنیم اما اکنون با استفاده از عمل Cast این تبدیل انجام خواهد شد :

int number1 = 5;

byte number2 = (byte)number1;

حال اگر برنامه را اجرا کنید با خطا مواجه نخواهید شد. همانطور که پیشتر اشاره شد ممکن است در هنگام تبدیلات مقادیر اصلی تغییر کنند. برای مثال وقتی که یک عدد با ممیز اعشار مثلاً از نوع double را به یک نوع int تبدیل می‌کنیم مقدار اعداد بعد از ممیز از بین می‌روند :

double number1 = 5.25;

int number2 = (int)number1;

System.out.println(number2);
5

خروجی کد بالا عدد 5 است چون نوع داده‌ای int نمی‌تواند مقدار اعشار بگیرد. حالت دیگر را تصور کنید. اگر شما بخواهید یک متغیر را که دارای مقداری بیشتر از محدوده متغیر مقصد هست تبدیل کنید چه اتفاقی می افتد؟ مانند تبدیل زیر که می‌خواهیم متغیر number1 را که دارای مقدار 300 است را به نوع بایت تبدیل کنیم که محدود اعداد بین 255-0 را پوشش می‌دهد.

int number1 = 300;

byte number2 = (byte)number1;

System.out.println(MessageFormat.format("Value of number2 is {0}.", number2));
Value of number2 is 44.

خروجی کد بالا عدد 44 است. Byte فقط می‌تواند شامل اعداد 0 تا 255 باشد و نمی‌تواند مقدار 300 را در خود ذخیره کند. حال می‌خواهیم ببینیم که چرا به جای عدد 300 ما عدد 44 را در خروجی می‌گیریم. این کار به تعداد بیتها بستگی دارد. یک byte دارای 8 بیت است درحالی که int دارای 32 بیت است. حال اگر به مقدار باینری 2 عدد توجه کنید متوجه می‌شوید که چرا خروجی عدد 44 است.

300 = 00000000000000000000000100101100 
255 =                         11111111 
 44 =                         00101100

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