CodeGym /وبلاگ جاوا /Random-FA /گسترش و باریک شدن انواع اولیه
John Squirrels
مرحله
San Francisco

گسترش و باریک شدن انواع اولیه

در گروه منتشر شد
سلام! همانطور که در CodeGym پیشرفت کرده اید، بارها با انواع ابتدایی مواجه شده اید. در اینجا لیست کوتاهی از آنچه در مورد آنها می دانیم آورده شده است:
  1. آنها اشیاء نیستند و مقدار ذخیره شده در حافظه را نشان می دهند
  2. چندین نوع وجود دارد
    • اعداد کامل: بایت ، کوتاه ، int ، طولانی
    • اعداد ممیز شناور (کسری): شناور و دو برابر
    • مقادیر منطقی: بولی
    • مقادیر نمادین (برای نمایش حروف و اعداد): char
  3. هر نوع دارای محدوده مقادیر خاص خود است:

نوع اولیه اندازه در حافظه محدوده ارزش
بایت 8 بیت -128 تا 127
کوتاه 16 بیت -32768 تا 32767
کاراکتر 16 بیت 0 تا 65536
بین المللی 32 بیت -2147483648 تا 2147483647
طولانی 64 بیت -9223372036854775808 تا 9223372036854775807
شناور 32 بیت (2 به توان 149-) تا ((2 - (2 به توان 23-)) * 2 به توان 127)
دو برابر 64 بیت (2- به توان 63) تا ((2 به توان 63) - 1)
بولی 8 (در صورت استفاده در آرایه ها)، 32 (اگر در آرایه ها استفاده نمی شود) درست یا غلط
اما علاوه بر داشتن مقادیر متفاوت، در میزان فضایی که در حافظه اشغال می کنند نیز متفاوت هستند. یک int بیش از یک بایت طول می کشد. و بلندتر از کوتاه است. میزان حافظه اشغال شده توسط افراد اولیه را می توان با عروسک های تودرتو روسی مقایسه کرد: وسعت و باریک شدن انواع بدوی - 2 هر عروسک تودرتو فضایی در داخل دارد. هر چه عروسک تودرتو بزرگتر باشد، فضای بیشتری وجود دارد. یک عروسک تودرتوی بزرگ ( طولانی ) به راحتی می‌تواند یک عدد کوچکتر را در خود جای دهد . به راحتی جا می شود و نیازی به انجام کار دیگری ندارید. در جاوا هنگام کار با primitive ها به این تبدیل ضمنی می گویند. یا به عبارت دیگر، به آن تعریض می گویند.

گسترش در جاوا

در اینجا یک مثال ساده از تبدیل گسترده آورده شده است:
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 بیت اول شماره ما به آنجا منتقل می شود. بقیه کنار گذاشته خواهد شد. در نتیجه متغیر short مقدار زیر را دریافت می کند
وسعت و باریک شدن انواع اولیه - 4
که به صورت اعشاری برابر است با -27008 به همین دلیل است که کامپایلر از شما می خواهد تا با نشان دادن یک تبدیل باریک صریح به یک نوع خاص، "تأیید" کنید. اول، این نشان می دهد که شما مسئولیت نتیجه را به عهده می گیرید. و دوم، به کامپایلر می‌گوید که چه مقدار فضایی را برای تخصیص در هنگام تبدیل انجام می‌دهد. از این گذشته، در مثال آخر، اگر یک مقدار int به یک متغیر بایت به جای short نسبت دهیم، آنگاه فقط 8 بیت در اختیار داریم، نه 16، و نتیجه متفاوت خواهد بود. انواع کسری ( شناور و دوگانه ) فرآیند خاص خود را برای باریک کردن تبدیل دارند. اگر سعی کنید یک عدد جزئی را به یک نوع صحیح وارد کنید، قسمت کسری کنار گذاشته می‌شود.
public static void main(String[] args) {

   double d = 2.7;

   long x = (int) d;
   System.out.println(x);
}
خروجی کنسول: 2

کاراکتر

قبلاً می دانید که char برای نمایش کاراکترهای جداگانه استفاده می شود.
public static void main(String[] args) {

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

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

   int x = 32816;

   char c = (char) x ;
   System.out.println(c);
}
خروجی کنسول: 耰 این فرمتی است که برای ذخیره کاراکترها در جاوا استفاده می شود. هر نماد مربوط به یک عدد است: یک کد عددی 16 بیتی (دو بایتی). در یونیکد، 32816 با کاراکتر چینی 耰 مطابقت دارد. به نکته زیر توجه کنید. در این مثال از یک متغیر int استفاده کردیم . این حافظه 32 بیت را اشغال می کند، در حالی که یک کاراکتر 16 بیت را اشغال می کند . اگرچه اندازه یک کاراکتر (درست مانند یک کوتاه ) 16 بیت است، اما هیچ عدد منفی در محدوده کاراکتر وجود ندارد ، بنابراین قسمت "مثبت" محدوده کاراکتر دو برابر بزرگتر است (65536 به جای 32767 برای نوع کوتاه ) . تا زمانی که کد ما زیر 65536 بماند، می توانیم از یک int استفاده کنیم. اما اگر مقدار int بزرگتر از 65536 ایجاد کنید ، بیش از 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