CodeGym /جاوا بلاگ /Random-UR /قدیم اقسام کو چوڑا اور تنگ کرنا
John Squirrels
سطح
San Francisco

قدیم اقسام کو چوڑا اور تنگ کرنا

گروپ میں شائع ہوا۔
ہائے! جیسا کہ آپ CodeGym کے ذریعے ترقی کر چکے ہیں، آپ کو کئی بار قدیم اقسام کا سامنا کرنا پڑا ہے۔ ہم ان کے بارے میں کیا جانتے ہیں اس کی ایک مختصر فہرست یہ ہے:
  1. وہ اشیاء نہیں ہیں اور میموری میں ذخیرہ شدہ قدر کی نمائندگی کرتے ہیں۔
  2. کئی قسمیں ہیں۔
    • پورے نمبر: بائٹ ، مختصر ، انٹ ، لمبی
    • فلوٹنگ پوائنٹ (فریکشنل) نمبرز: فلوٹ اور ڈبل
    • منطقی اقدار: بولین
    • علامتی قدریں (حروف اور ہندسوں کی نمائندگی کے لیے): 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 ایک بائٹ سے زیادہ لیتا ہے۔ اور لمبا مختصر سے بڑا ہوتا ہے۔ قدیم انسانوں کے زیر قبضہ میموری کی مقدار کا موازنہ روسی گھونسلے والی گڑیا سے کیا جا سکتا ہے: قدیم اقسام کو چوڑا اور تنگ کرنا - 2 ہر گھونسلے کی گڑیا کے اندر جگہ موجود ہوتی ہے۔ گھونسلے کی گڑیا جتنی بڑی ہوگی، اتنی ہی زیادہ جگہ ہوگی۔ گھوںسلا کرنے والی ایک بڑی گڑیا ( لمبی ) ایک چھوٹی انٹ کو آسانی سے ایڈجسٹ کرے گی ۔ یہ آسانی سے فٹ ہوجاتا ہے اور آپ کو کچھ اور کرنے کی ضرورت نہیں ہے۔ جاوا میں، پرائمیٹوز کے ساتھ کام کرتے وقت، اسے مضمر تبدیلی کہا جاتا ہے۔ یا مختلف طریقے سے ڈالیں، اسے چوڑا ہونا کہتے ہیں۔

جاوا میں چوڑا ہونا

یہاں ایک وسیع کرنے والی تبدیلی کی ایک سادہ مثال ہے:
public class Main {

   public static void main(String[] args) {

       int bigNumber = 10000000;

       byte littleNumber = 16;

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

   int bigNumber = 10000000;

   short littleNumber = 1000;

   littleNumber = bigNumber;// Error!
   System.out.println(bigNumber);
}
غلطی! مرتب کرنے والا سمجھتا ہے کہ آپ ایک چھوٹی سی ( شارٹ ) کے اندر ایک بڑی نیسٹنگ ڈول ( int ) کو ہلا کر کچھ غیر معمولی کرنے کی کوشش کر رہے ہیں۔ اس صورت میں، تالیف کی خرابی کمپائلر کی طرف سے ایک انتباہ ہے: "ارے، کیا آپ کو بالکل یقین ہے کہ آپ یہ کرنا چاہتے ہیں؟" اگر آپ کو یقین ہے، تو آپ کمپائلر سے کہتے ہیں: "سب کچھ ٹھیک ہے۔ میں جانتا ہوں کہ میں کیا کر رہا ہوں!" اس عمل کو واضح قسم کی تبدیلی، یا تنگ کرنا کہا جاتا ہے۔

جاوا میں تنگ کرنا

ایک تنگ تبدیلی کو انجام دینے کے لیے، آپ کو واضح طور پر اس قسم کی نشاندہی کرنے کی ضرورت ہے جس میں آپ اپنی قدر کو تبدیل کرنا چاہتے ہیں۔ دوسرے لفظوں میں، آپ کو مرتب کرنے والے کے سوال کا جواب دینے کی ضرورت ہے: "اچھا، آپ ان چھوٹی گڑیوں میں سے کس گھونسلے میں ڈالنا چاہتے ہیں؟" ہمارے معاملے میں، یہ اس طرح لگتا ہے:
public static void main(String[] args) {

   int bigNumber = 10000000;

   short littleNumber = 1000;

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

   int x = 32816;

   char c = (char) x ;
   System.out.println(c);
}
کنسول آؤٹ پٹ: 耰 یہ وہ فارمیٹ ہے جو جاوا میں char s کو ذخیرہ کرنے کے لیے استعمال ہوتا ہے۔ ہر علامت ایک عدد سے مطابقت رکھتی ہے: ایک 16 بٹ (دو بائٹ) عددی کوڈ۔ یونیکوڈ میں، 32816 چینی حرف 耰 سے مماثل ہے۔ درج ذیل نکتے کو نوٹ کریں۔ اس مثال میں، ہم نے ایک int متغیر کا استعمال کیا. یہ میموری میں 32 بٹس پر قبضہ کرتا ہے، جبکہ ایک چار 16 پر قبضہ کرتا ہے۔ یہاں ہم نے ایک int کا انتخاب کیا، کیونکہ ہمارا نمبر (32816) مختصر میں فٹ نہیں ہوگا ۔ اگرچہ ایک چار کا سائز (بالکل ایک مختصر کی طرح) 16 بٹس ہے، چار رینج میں کوئی منفی نمبر نہیں ہیں ، لہذا چار رینج کا "مثبت" حصہ دو گنا بڑا ہے ( مختصر قسم کے لیے 32767 کے بجائے 65536 ) . ہم ایک int استعمال کر سکتے ہیں جب تک کہ ہمارا کوڈ 65536 سے نیچے رہتا ہے۔ لیکن اگر آپ 65536 سے زیادہ int ویلیو بناتے ہیں، تو یہ 16 سے زیادہ بٹس پر قبضہ کرے گا۔ اور اس کے نتیجے میں تبادلوں میں کمی آئے گی۔
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_О یہ کیسے معنی رکھتا ہے؟ 1+1۔ 50 کہاں سے آئے؟! آپ پہلے ہی جان چکے ہیں کہ charقدریں میموری میں 0 سے 65536 تک کے اعداد کے طور پر محفوظ ہوتی ہیں، اور یہ کہ یہ نمبرز کسی کریکٹر کی یونیکوڈ نمائندگی ہیں۔ قدیم اقسام کو چوڑا اور تنگ کرنا - 6 جب ہم ایک چار اور کچھ پورے نمبر کی قسم شامل کرتے ہیں، تو چار متعلقہ یونیکوڈ نمبر میں تبدیل ہو جاتا ہے۔ ہمارے کوڈ میں، جب ہم نے 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