CodeGym /مدونة جافا /Random-AR /كيفية تحويل طويلة إلى int في جافا
John Squirrels
مستوى
San Francisco

كيفية تحويل طويلة إلى int في جافا

نشرت في المجموعة
سنشرح في هذه المقالة كيفية التحويل الطويل إلى int في Java وكتابة بعض أمثلة التعليمات البرمجية. نظرًا لأن long هو نوع بيانات أكبر من int ، فيجب علينا هنا استخدام نوع البيانات لمثل هذا التحويل. كما تعلم بالفعل فإن كلا من long و int في Java هما أنواع بيانات بدائية. هذا يعني أنهم ليسوا كائنات طبقية. يتم تخزين جميع الكائنات والمصفوفات في Heap Space بينما يتم تخزين الأنواع البدائية مثل int و long في ذاكرة Stack. Long و int متشابهان إلى حد ما. العدد الصحيح يعني العدد الصحيح، الذي يمكن أن يكون موجبًا أو سالبًا أو صفرًا. كلا النوعين long و int هما نوعان صحيحان، لذا فهما متوافقان بطريقة ما. المشكلة هي أن النوع الطويل يتراوح من -263 إلى 263 - 1، أو -9223372036854775808 إلى 9223372036854775807. أي أن برنامج Java يخصص 64 بت للنوع الطويل . في الوقت نفسه، يشغل النوع int 32 بت، حيث يمكنك وضع أرقام من -231 إلى 231 - 1 أو، وهو نفس الشيء، من -2147483648 إلى 2147483647. هذا يعني أن أي عدد من النوع int يمكن أن يتناسب بسهولة مع نوع طويل . في Java، عند العمل مع العناصر الأولية، يكون التحويل من نوع أضيق إلى نوع أوسع تلقائيًا. وبطريقة أخرى يطلق عليه اتساع.
int myInt= 18;
long myLong= 16000;
       myLong = myInt;
نحن هنا نقوم بتعيين int لمتغير طويل . كل شيء سار بسلاسة، في نطاق أكبر، وأصغر يناسب بهدوء ولا نفقد أي شيء باستثناء مساحة الذاكرة. بالمناسبة، عندما نعلن عن متغير من النوع طويل ونحدد قيمته، فمن الأفضل تخصيص الحرف l له، وسيكون هذا مفيدًا عندما نعمل مع أرقام خارج نطاق int .
long myVeryLong = 10000000000l;

جافا طويلة لتحويل كثافة العمليات

الآن دعنا نعود إلى المهمة الرئيسية لهذه المقالة - تحويل Java long إلى int . المشكلة هي أن شيئًا أكبر لا يتناسب دائمًا مع شيء أصغر. لذا، لا يمكننا هنا وضع "أصغر" في "أكبر" تلقائيًا في Java. إذا حاولنا أن نتصرف كما في المثال السابق ولكن العكس:
//example without typecasting…nice trying!
public static void main(String[] args) {

int myInt= 18;
long myLong= 16000;
       myInt = myLong;
}
لن يسمح لنا مترجم Java بالقيام بذلك وسيقوم بإلقاء خطأ. لذلك، في هذه العملية، نحن بحاجة إلى استخدام ما يسمى typecasting. تسمى هذه العملية تحويل النوع الضيق. لتضييق نطاق المتغير، تحتاج إلى تحديد النوع الذي تريد إلقاء القيمة عليه بشكل صريح. فيما يلي مثال حيث سنحاول وضع رقم طويل "صغير" على int (يجب أن يتناسب مع ذلك) ورقمين طويلين "كبيرين" خارج نطاق 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);
   }
}
لقد أبلغنا المترجم بأننا نريد وضع القيمة الطويلة في متغير int ونحن مسؤولون عن عواقب هذا القرار. يقوم المترجم، بعد أن يرى إشارة واضحة لنوع أضيق، بإجراء التحويل. ونتيجة لذلك نحصل على الناتج:
16000 -2147483648 1410065408
حسنًا، 16000 هو بالتأكيد ما توقعنا رؤيته، ولكن لماذا يكون ناقص -2147483648؟ وماذا يعني هذا 1410065408؟ والحقيقة هي أنه تم تخزين هذه الأرقام في متغير طويل ، والذي، كما نتذكر، يستغرق 64 بت. نحن نحاول وضع هذه الأرقام في متغير int يمكنه تخزين 32 بت فقط. كقاعدة عامة، ستحتوي هذه الخلايا الـ 32 على أصفار وآحاد من أول 32 بت من الرقم الطويل ، وسيتم التخلص من الباقي ببساطة. لذلك، إذا كان الرقم الأصلي لا يتناسب مع 32 بت، فسيتم ببساطة التخلص من تلك البتات التي لا تتناسب. ولهذا السبب لدينا فقط الرقم الصحيح 16000، لأنه يشغل أقل من 32 بت.

جافا 8 طويل لتحويل كثافة العمليات

في Java 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 استثناء في مؤشر الترابط "الرئيسي" java.lang.ArithmeticException: تجاوز عدد صحيح في java.base/java.lang.Math.toIntExact(Math.java:1080) في intToLong.main(intToLong.java:13)
وبالتالي، قام البرنامج بطباعة الرقم الوحيد الذي تم تحويله بشكل صحيح 16000، وبعد ذلك عند محاولة دفع الرقم خارج النطاق 2147483648l إلى int ، طرحت الطريقة استثناءً. لذا، لا نواجه مشكلة البتات المهملة، كما في حالة تحويل Java الكلاسيكي إلى int .
تعليقات
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION