CodeGym /وبلاگ جاوا /Random-FA /نحوه تبدیل long به int در جاوا
John Squirrels
مرحله
San Francisco

نحوه تبدیل long به int در جاوا

در گروه منتشر شد
در این مقاله قصد داریم نحوه تبدیل long به int در جاوا و نوشتن چند نمونه کد را توضیح دهیم. از آنجایی که long یک نوع داده بزرگتر از int است ، در اینجا باید از نوع ریخته گری برای چنین تبدیلی استفاده کنیم. همانطور که احتمالا قبلاً می دانید هر دو long و int در جاوا انواع داده های اولیه هستند. این بدان معناست که آنها اشیاء کلاس نیستند. همه اشیاء و آرایه ها در Heap Space ذخیره می شوند در حالی که انواع اولیه مانند int و long در حافظه Stack ذخیره می شوند. Long و int تا حدودی شبیه هم هستند. عدد صحیح به معنای عدد کامل است که می تواند مثبت، منفی یا صفر باشد. هر دو long و int از انواع عدد صحیح هستند، بنابراین به نوعی با هم سازگار هستند. مشکل این است که نوع طولانی از -263 تا 263 – 1 یا -9223372036854775808 تا 9223372036854775807 است. یعنی برنامه جاوا 64 بیت را برای یک نوع طولانی اختصاص می دهد. در عین حال، نوع int 32 بیت را اشغال می کند ، که در آن می توانید اعدادی از -231 تا 231 - 1 یا همان 2147483648 - تا 2147483647 را در آن قرار دهید. نوع بلند در جاوا هنگام کار با primitive ها، تبدیل از نوع باریک به نوع گسترده تر به صورت خودکار است. به نوعی دیگر به آن تعریض می گویند.
int myInt= 18;
long myLong= 16000;
       myLong = myInt;
در اینجا ما یک int را به یک متغیر طولانی اختصاص می دهیم . همه چیز به آرامی پیش رفت، در یک محدوده بزرگتر، یک کوچکتر بی سر و صدا قرار می گیرد و ما چیزی جز فضای حافظه را از دست نمی دهیم. ضمناً، وقتی یک متغیر از نوع long را اعلام می کنیم و مقدار آن را تعریف می کنیم، بهتر است حرف l را به آن اختصاص دهیم، وقتی با اعداد خارج از محدوده int کار می کنیم، این به کار می آید .
long myVeryLong = 10000000000l;

تبدیل طولانی جاوا به int

حالا بیایید به وظیفه اصلی این مقاله برگردیم - تبدیل جاوا طولانی به بین المللی . مشکل این است که چیز بزرگتر همیشه در چیز کوچکتر قرار نمی گیرد. بنابراین در اینجا ما نمی‌توانیم در جاوا فقط «کوچک‌تر» را در «بزرگ‌تر» به طور خودکار قرار دهیم. اگر سعی کنیم مانند مثال قبلی عمل کنیم، اما برعکس:
//example without typecasting…nice trying!
public static void main(String[] args) {

int myInt= 18;
long myLong= 16000;
       myInt = myLong;
}
کامپایلر جاوا به ما اجازه این کار را نمی دهد و یک خطا ایجاد می کند. بنابراین برای این عملیات باید از چیزی که typecasting نامیده می شود استفاده کنیم. این فرآیند تبدیل نوع باریک نامیده می شود. برای محدود کردن یک متغیر، باید صریحاً نوع مورد نظر خود را برای ارسال مقدار مشخص کنید. در اینجا مثالی وجود دارد که در آن سعی می کنیم یک عدد طولانی "کوچک" ( که باید متناسب باشد) و دو عدد طولانی "بزرگ" خارج از محدوده int قرار دهیم.
public class longToInt {

   public static void main(String[] args) {

       int myInt = 18;
       long myLong = 16000;
       long myVeryLong = 2147483648l;//l in the end means ‘long’
       long myVeryLong = 10000000000l;

       myInt = (int) myLong;
       System.out.println(myInt);
       myInt = (int) oneMoreLong;
       System.out.println(myInt);
       myInt = (int) myVeryLong;
       System.out.println(myInt);
   }
}
ما به کامپایلر اطلاع داده ایم که می خواهیم مقدار long را در یک متغیر int قرار دهیم و ما مسئول عواقب این تصمیم هستیم. کامپایلر با دیدن نشانه ای صریح از نوع باریک تر، تبدیل را انجام می دهد. در نتیجه، خروجی را دریافت می کنیم:
16000 -2147483648 1410065408
خوب، 16000 قطعاً همان چیزی است که انتظار داشتیم ببینیم، اما چرا منفی در -2147483648 است؟ و این 1410065408 به چه معناست؟ واقعیت این است که چنین اعدادی در یک متغیر طولانی ذخیره می شدند که همانطور که به یاد داریم 64 بیت طول می کشد. ما سعی می کنیم این اعداد را در یک متغیر int قرار دهیم که فقط می تواند 32 بیت را ذخیره کند. به عنوان یک قاعده، این 32 سلول حاوی صفر و یک از 32 بیت اول عدد طولانی خواهند بود و بقیه به سادگی کنار گذاشته می شوند. بنابراین، اگر عدد اصلی در 32 بیت قرار نگیرد، آن بیت هایی که مناسب نیستند به سادگی کنار گذاشته می شوند. به همین دلیل است که ما فقط عدد صحیح 16000 را داریم، زیرا کمتر از 32 بیت را اشغال می کند.

تبدیل جاوا 8 طولانی به int

در جاوا 8، کلاس Math متد جدیدی دارد که long را به int تبدیل می کند . ایناهاش:
Math.toIntExact(value);
بهترین چیز در مورد این روش این است که طول عدد تبدیل شده را کنترل می کند و اگر مقدار آنقدر بزرگ باشد که در یک int قرار نگیرد ، یک استثنا ایجاد می کند. بیایید ببینیم که در مثال ما چگونه کار می کند:
public class intToLong {

   public static void main(String[] args) {

       int myInt = 18;
       long myLong = 16000;
       long oneMoreLong = 2147483648l;
       long myVeryLong = 10000000000l;

       System.out.println(Math.toIntExact(myLong));
       int y = Math.toIntExact(oneMoreLong);
       System.out.println(oneMoreLong);
       System.out.println(Math.toIntExact(myVeryLong));
   }
}
خروجی این است:
16000 استثنا در رشته "main" java.lang.ArithmeticException: سرریز عدد صحیح در java.base/java.lang.Math.toIntExact(Math.java:1080) در intToLong.main(intToLong.java:13)
بنابراین، برنامه تنها عدد 16000 را که به درستی تبدیل شده بود چاپ کرد، و سپس هنگام تلاش برای فشار دادن شماره خارج از محدوده 2147483648l به int ، روش یک استثنا را ایجاد کرد. بنابراین ما مشکل بیت های دور ریخته شده را نداریم، مانند مورد تبدیل جاوای کلاسیک طولانی به int .
نظرات
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION