CodeGym /בלוג Java /Random-HE /כיצד להמיר long ל-int ב-Java
John Squirrels
רָמָה
San Francisco

כיצד להמיר long ל-int ב-Java

פורסם בקבוצה
במאמר זה, אנו הולכים להסביר כיצד להמיר long ל- 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 למשתנה ארוך . הכל הלך חלק, בטווח גדול יותר, קטן יותר מתאים בשקט ואנחנו לא מאבדים שום דבר מלבד מקום זיכרון. אגב, כשאנחנו מכריזים על משתנה מסוג long ומגדירים את ערכו, עדיף להקצות לו את האות l , זה יהיה שימושי כשנעבוד עם מספרים מחוץ לטווח int .

long myVeryLong = 10000000000l;

המרת Java long ל-int

כעת נחזור למשימה העיקרית של מאמר זה - המרת Java long to int . הבעיה היא שמשהו גדול יותר לא תמיד מתאים למשהו קטן יותר. אז כאן אנחנו לא יכולים פשוט לשים "קטן יותר" לתוך "גדול יותר" באופן אוטומטי בג'אווה. אם ננסה לפעול כמו בדוגמה הקודמת, אבל להיפך:

//example without typecasting…nice trying! 
public static void main(String[] args) {

int myInt= 18;
long myLong= 16000;
       myInt = myLong;
}
מהדר ג'אווה פשוט לא יאפשר לנו לעשות זאת ויגרום לשגיאה. אז עבור הפעולה הזו, אנחנו צריכים להשתמש במה שנקרא 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 סיביות.

המרת Java 8 ארוכה ל-int

ב-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 long to int .
הערות
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION