JavaRush /جاوا بلاگ /Random-UR /جاوا میں کاسٹنگ (تبدیل) قدیم اقسام

جاوا میں کاسٹنگ (تبدیل) قدیم اقسام

گروپ میں شائع ہوا۔
ہیلو! JavaRush سے گزرتے ہوئے، آپ نے ایک سے زیادہ مرتبہ قدیم اقسام کو دیکھا۔ ہم ان کے بارے میں کیا جانتے ہیں اس کی ایک مختصر فہرست یہ ہے:
  1. وہ اشیاء نہیں ہیں اور میموری میں ذخیرہ شدہ قدر کی نمائندگی کرتے ہیں۔
  2. قدیم اقسام کی کئی اقسام ہیں:
    • مکمل اعداد - byte، short، int،long
    • فلوٹنگ پوائنٹ نمبرز (فرکشنل) - floatاورdouble
    • بولین -boolean
    • علامتی (حروف اور اعداد کی نشاندہی کرنے کے لیے) -char
  3. ان میں سے ہر ایک کی اقدار کی اپنی حد ہے:
قدیم قسم میموری میں سائز اقدار کی حد
بائٹ 8 بٹ -128 سے 127
مختصر 16 بٹ -32768 سے 32767 تک
چار 16 بٹ 0 سے 65536 تک
int 32 بٹس -2147483648 سے 2147483647 تک
طویل 64 بٹس -9223372036854775808 سے 9223372036854775807
تیرنا 32 بٹس (2 سے پاور -149) تک ((2-2 سے پاور -23)*2 سے پاور 127)
دگنا 64 بٹس (-2 سے 63 کی طاقت تک) تک (2 سے 63 کی طاقت تک) - 1)
بولین 8 (جب صفوں میں استعمال ہوتا ہے)، 32 (جب غیر صفوں میں استعمال ہوتا ہے) صحیح یا غلط
لیکن، اقدار کے علاوہ، اقسام میموری کے سائز میں بھی مختلف ہوتی ہیں۔ intسے زیادہ لیتا ہے byte. A long- سے زیادہ short۔ قدیم لوگوں کے زیر قبضہ میموری کی مقدار کا موازنہ گھونسلے والی گڑیا سے کیا جا سکتا ہے: قدیم اقسام کی توسیع اور سکڑاؤ - 2 گھونسلے کی گڑیا کے اندر خالی جگہ ہوتی ہے۔ گھونسلے کی گڑیا جتنی بڑی ہوگی اتنی ہی زیادہ جگہ ہوگی۔ ہم آسانی سے ایک بڑی گڑیا کے اندر longایک چھوٹی کو ڈال سکتے ہیں int۔ یہ آسانی سے فٹ بیٹھتا ہے اور آپ کو کچھ اضافی کرنے کی ضرورت نہیں ہے۔ جاوا میں، پرائمیٹوز کے ساتھ کام کرتے وقت، اسے خودکار تبدیلی کہا جاتا ہے۔ دوسرے طریقے سے اسے ایکسٹینشن کہا جاتا ہے۔ یہاں ایک سادہ توسیع مثال ہے:
public class Main {

   public static void main(String[] args) {

       int bigNumber = 10000000;

       byte littleNumber = 16;

       bigNumber = littleNumber;
       System.out.println(bigNumber);
   }
}
یہاں ہم byteمتغیر کو ایک قدر تفویض کرتے ہیں int۔ اسائنمنٹ کامیاب اور بغیر کسی دشواری کے: اس میں ذخیرہ شدہ قدر byteاس میں "فٹ" ہونے سے کم میموری کی جگہ پر قبضہ کرتی ہے int۔ "چھوٹی گھونسلے والی گڑیا" (قدر byte) آسانی سے "بڑی میٹریوشکا" (متغیر int) میں فٹ ہوجاتی ہے۔ جب آپ اس کے برعکس کرنے کی کوشش کرتے ہیں تو یہ ایک اور بات ہے - ایک متغیر میں ایک بڑی قدر ڈالیں جو اس طرح کے سائز کے لیے ڈیزائن نہیں کیا گیا ہے۔ اصولی طور پر، یہ چال اصلی گھونسلے والی گڑیا کے ساتھ کام نہیں کرے گی، لیکن جاوا میں یہ کام کرے گی، لیکن باریکیوں کے ساتھ۔ آئیے ایک قدر کو intمتغیر میں ڈالنے کی کوشش کریں short:
public static void main(String[] args) {

   int bigNumber = 10000000;

   short littleNumber = 1000;

   littleNumber = bigNumber;//error!
   System.out.println(bigNumber);
}
غلطی! مرتب کرنے والا سمجھتا ہے کہ آپ کچھ غیر معیاری کرنے کی کوشش کر رہے ہیں، اور ایک بڑی گڑیا ( int) کو ایک چھوٹی ( short) کے اندر رکھ دیں۔ اس معاملے میں تالیف کی غلطی کمپائلر کی طرف سے ایک انتباہ ہے: " ارے، کیا آپ واقعی یہ کرنا چاہتے ہیں؟ "اگر آپ کو یقین ہے تو، مرتب کرنے والے کو اس کے بارے میں بتائیں: " سب کچھ ٹھیک ہے، میں جانتا ہوں کہ میں کیا کر رہا ہوں!" اس عمل کو واضح قسم کی تبدیلی، یا تنگ کرنا کہا جاتا ہے ۔ تنگ کرنے کے لیے، آپ کو واضح طور پر اس قسم کی نشاندہی کرنے کی ضرورت ہے جس پر آپ اپنی قدر کاسٹ کرنا چاہتے ہیں۔ دوسرے لفظوں میں، مرتب کرنے والے کے سوال کا جواب دیں: " اچھا، آپ ان چھوٹی گڑیوں میں سے کس میں یہ بڑی گڑیا ڈالنا چاہتے ہیں؟" ہمارے معاملے میں یہ اس طرح نظر آئے گا:
public static void main(String[] args) {

   int bigNumber = 10000000;

   short littleNumber = 1000;

   littleNumber = (short) bigNumber;
   System.out.println(littleNumber);
}
ہم نے واضح طور پر اشارہ کیا کہ ہم قدر کو intمتغیر میں فٹ کرنا چاہتے ہیں shortاور اس کی ذمہ داری لینا چاہتے ہیں۔ مرتب کرنے والا، ایک تنگ قسم کے واضح اشارے کو دیکھ کر، تبدیلی کرتا ہے۔ نتیجہ کیا نکلے گا؟ کنسول آؤٹ پٹ: -27008 تھوڑا غیر متوقع۔ بالکل اس طرح کیوں؟ یہ اصل میں سادہ ہے. ہمارے پاس اصل قیمت تھی - 10000000 یہ ایک متغیر میں ذخیرہ کیا گیا تھا intجس نے 32 بٹس لیا تھا، اور بائنری شکل میں یہ اس طرح نظر آتا تھا: قدیم اقسام کی توسیع اور سکڑاؤ - 3 ہم اس قدر کو متغیر میں لکھتے ہیں short، لیکن یہ صرف 16 بٹس کو ذخیرہ کر سکتا ہے! اس کے مطابق، ہمارے نمبر کے صرف پہلے 16 بٹس کو وہاں منتقل کیا جائے گا، باقی کو ضائع کر دیا جائے گا۔ نتیجے کے طور پر، متغیر shortمیں ویلیو ہوگی قدیم اقسام کی توسیع اور سکڑاؤ - 4، جو کہ اعشاریہ کی شکل میں بالکل -27008 کے برابر ہے، اسی لیے کمپائلر نے ایک مخصوص قسم کے لیے واضح کاسٹ کی صورت میں "تصدیق کے لیے پوچھا"۔ سب سے پہلے، یہ ظاہر کرتا ہے کہ آپ نتیجہ کی ذمہ داری قبول کرتے ہیں، اور دوسرا، یہ مرتب کرنے والے کو بتاتا ہے کہ قسمیں ڈالتے وقت کتنی جگہ مختص کرنی ہے۔ بہر حال، اگر آخری مثال میں ہم نے intٹائپ کرنے کے لیے کاسٹ کیا تھا byte، اور نہ کرنے کے لیے short، تو ہمارے پاس صرف 8 بٹس ہوتے، 16 نہیں، اور نتیجہ مختلف ہوتا۔ جزوی اقسام کے لیے ( floatاور double)، تنگ کرنا مختلف طریقے سے ہوتا ہے۔ اگر آپ ایسے نمبر کو عددی قسم میں تبدیل کرنے کی کوشش کرتے ہیں، تو اس کا جزوی حصہ ضائع کر دیا جائے گا۔
public static void main(String[] args) {

   double d = 2.7;

   long x = (int) d;
   System.out.println(x);
}
کنسول آؤٹ پٹ: 2

ڈیٹا کی قسم چار

آپ پہلے ہی جانتے ہیں کہ چار قسم کا استعمال انفرادی حروف کو ظاہر کرنے کے لیے کیا جاتا ہے۔
public static void main(String[] args) {

   char c = '!';
   char z = 'z';
   char i = '8';

}
لیکن اس میں متعدد خصوصیات ہیں جن کو سمجھنا ضروری ہے۔ آئیے قدر کی حدود کے ساتھ ٹیبل کو دوبارہ دیکھیں:
قدیم قسم میموری میں سائز اقدار کی حد
بائٹ 8 بٹ -128 سے 127
مختصر 16 بٹ -32768 سے 32767
چار 16 بٹ 0 سے 65536 تک
int 32 بٹس -2147483648 سے 2147483647 تک
طویل 64 بٹس -9223372036854775808 سے 9223372036854775807
تیرنا 32 بٹس (2 سے پاور -149) تک ((2-2 سے پاور -23)*2 سے پاور 127)
دگنا 64 بٹس (-2 سے 63 کی طاقت تک) تک (2 سے 63 کی طاقت تک)
بولین 8 (جب صفوں میں استعمال ہوتا ہے)، 32 (جب غیر صفوں میں استعمال ہوتا ہے) صحیح یا غلط
اس قسم کی charعددی رینج 0 سے 65536 تک ہوتی ہے۔ لیکن اس کا کیا مطلب ہے؟ آخر کار، charیہ صرف نمبر ہی نہیں بلکہ حروف، اوقاف کے نشانات بھی ہیں... حقیقت یہ ہے کہ charجاوا میں یونیکوڈ فارمیٹ میں قدریں محفوظ ہیں۔ ہم پہلے ہی پچھلے لیکچرز میں سے ایک میں یونیکوڈ کا سامنا کر چکے ہیں۔ آپ کو شاید یاد ہو کہ یونیکوڈ ایک کریکٹر انکوڈنگ کا معیار ہے جس میں دنیا کی تقریباً تمام تحریری زبانوں کے حروف شامل ہوتے ہیں۔ دوسرے لفظوں میں، یہ خصوصی کوڈز کی فہرست ہے جس میں کسی بھی زبان کے تقریباً کسی بھی کردار کے لیے کوڈ ہوتا ہے۔ عام یونیکوڈ ٹیبل بہت بڑا ہے اور یقیناً اسے دل سے سیکھنے کی ضرورت نہیں ہے۔ یہاں، مثال کے طور پر، اس کا ایک ٹکڑا ہے: قدیم اقسام کی توسیع اور سکڑاؤ - 5 اہم چیز اقدار کو ذخیرہ کرنے کے اصول کو سمجھنا ہے char، اور یاد رکھیں کہ کسی مخصوص علامت کے کوڈ کو جان کر، آپ اسے ہمیشہ پروگرام میں حاصل کر سکتے ہیں۔ آئیے اسے کچھ بے ترتیب نمبر کے ساتھ آزمائیں:
public static void main(String[] args) {

   int x = 32816;

   char c = (char) x ;
   System.out.println(c);
}
کنسول آؤٹ پٹ: 耰 یہ وہ فارمیٹ ہے جس میں حروف کو Java میں محفوظ کیا جاتا ہے char۔ ہر کریکٹر ایک عدد سے مطابقت رکھتا ہے - 16 بٹس یا دو بائٹس کا عددی کوڈ۔ یونیکوڈ 32816 حرف 耰 سے مماثل ہے۔ اس لمحے پر توجہ دیں۔ اس مثال میں ہم نے متغیر کا استعمال کیا int۔ یہ میموری کے 32 بٹس پر قبضہ کرتا ہے ، جبکہ char16 ۔ یہاں ہم نے اس لیے منتخب کیا کہ ہمیں جس نمبر کی ضرورت ہے، 32816، حد سے باہر ہے ۔ اگرچہ سائز ، مختصر کی طرح، 16 بٹس ہے، رینج میں کوئی منفی نمبر نہیں ہیں، لہذا "مثبت" رینج دو گنا زیادہ ہے (32767 کی بجائے 65536 )۔ ہم استعمال کر سکتے ہیں ، جب تک کہ ہمارا کوڈ 65536 کی حد میں آتا ہے۔ لیکن اگر ہم ایک نمبر بناتے ہیں تو یہ 16 سے زیادہ بٹس لے گا۔ اور اقسام کو کم کرتے وقت: intshortcharcharcharshortintint >65536
char c = (char) x;
اضافی بٹس کو ضائع کر دیا جائے گا، اور نتیجہ کافی غیر متوقع ہو گا۔

چار اور عدد کے اضافے کی خصوصیات

آئیے اس غیر معمولی مثال کو دیکھیں:
public class Main {

   public static void main(String[] args) {

      char c = '1';

      int i = 1;

       System.out.println(i+c);
   }
}
کنسول آؤٹ پٹ: 50 O_O منطق کہاں ہے؟ 1+1، 50 کہاں سے آئے؟! آپ کو پہلے ہی معلوم ہے کہ اقدار charمیموری میں 0 سے 65536 تک کے اعداد کے طور پر محفوظ ہوتی ہیں، جو ہمارے کردار کے یونیکوڈ کی نمائندگی کرتی ہیں۔ قدیم اقسام کی توسیع اور سکڑاؤ - 6 تو یہ یہاں ہے۔ جب ہم اضافہ کرتے ہیں charاور کچھ عدد عدد کو charاس نمبر میں تبدیل کر دیا جاتا ہے جو یونیکوڈ میں اس سے مطابقت رکھتا ہے۔ جب ہم نے اپنے کوڈ میں 1 اور '1' کو شامل کیا تو علامت '1' کو اس کے کوڈ میں تبدیل کر دیا گیا، جو کہ 49 ہے (آپ اسے اوپر والے جدول میں دیکھ سکتے ہیں)۔ لہذا، نتیجہ 50 کے برابر ہو گیا۔ آئیے ایک بار پھر اپنے پرانے دوست کو مثال کے طور پر لیتے ہیں ، اور اسے کچھ نمبر کے ساتھ شامل کرنے کی کوشش کرتے ہیں۔
public static void main(String[] args) {

   char c = '耰';
   int x = 200;

   System.out.println(c + x);
}
کنسول آؤٹ پٹ: 33016 ہمیں پہلے ہی پتہ چلا ہے کہکوڈ 32816 سے مطابقت رکھتا ہے۔ اور جب ہم اس نمبر اور 200 کو جوڑتے ہیں تو ہمیں بالکل ہمارا نتیجہ ملتا ہے - 33016 :) آپریشن کا طریقہ کار، جیسا کہ آپ دیکھ سکتے ہیں، کافی آسان ہے۔
تبصرے
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION