
long לעומת int. ״מורכב״ פירושו טיפוס שיכול להחזיק גם נקודה עשרונית.a = 5 ו-b = 2 הם שניהם int, ולכן c = a / b נשמר כ-2 ולא כ-2.5. ההמרה ל-double רק אחרי החישוב לא עוזרת, כי הנקודה כבר אבדה.double, למשל double a = 5. אז כל החישוב מתבצע כ-double, ו-c מקבל 2.5.float. הפעולה מתבצעת באותו אופן, והתוצאה 2.5 נשמרת.(a / b) והופכים את התוצאה ל-double רק אחר כך, החלוקה כבר בוצעה כ-int, והתוצאה היא 2.0.הטקסט המלא של הדקות הראשונות בהרצאה «Arithmetic Operation Data Type» בקורס הווידאו של PracticU – כתוביות בעברית עם זמן התחלה לכל פסקה. כך תוכלו לקרוא ולחפש את הנושאים לפני שמתחילים ללמוד.
דבר נוסף שחשוב לנו להבין בנוגע לקאסטינג ושגם לפעולה אריתמטית יש טיפוס נתונים ואם אנחנו לא נבין את זה זה יכול לגרום לנו לבאגים.
בואו נראה מה הכוונה. בואו ניקח משתנה נקרא לו a ונחליף לתוכו 5. בואו ניקח משתנה נוסף נקרא לו b ונחליף לתוכו 2. בואו ניקח משתנה נוסף נקרא לו c ונחליף לתוכו את a.
לחלק ל-B. 5 לחלק ל-2 ו-2.5. עכשיו, int לא יכול להחזיק 2.5. בואו נציג את c, נריץ את זה, ונראה שכמובן הוא אומר לנו, תקשיבו, אני 2, מה הלוז? מה נסגר?
אז ברור שאני 2 מפני שאני לא יכול להיות 2.5. אוקיי? אז בואו נהפוך אותו ל-double. הנה עכשיו הפכנו את c ל-double.
יכול לקבל שתיים וחצי? בהחלט. בואו נריץ, וקיבלנו שתיים. מה זה הבאג הזה?
אז אנחנו צריכים להבין שיש כאן איזושהי פעולה מתמטית, והפעולה הזאת יש לה טיפוס נתונים. זאת אומרת, לפני שהתבצעה השמה, התבצעה פעולה, וכבר כאן ערך שלה, התוצאה שלה, הייתה בעלת טיפוס נתונים מסוים.
השאלה היא, איך אנחנו מחשבים את טיפוס הנתונים? אז החוק אומר כזה דבר: טיפוס הנתונים של פעולה אריתמטית הוא טיפוס הנתונים הגדול יותר ו/או המורכב יותר מבין מרכיבי הפעולה האריתמטית.
מה זאת אומרת? פעולה אריתמטית תמיד בנויה ממרכיבים, חלקים a, b, לחלק ל-8, כפול 7. כל המרכיבים שלה, לכל אחד מהם יש טיפוס נתונים.
המערכת לוקחת את כל הטיפוסים ביניהם, מחפשת את הטיפוס הכי גדול בזיכרון או הכי מורכב בזיכרון, ואומרת שהסוג של התוצאה של הפעולה זה מהסוג שלו.
מה זאת אומרת יותר גדול? long יותר גדול מ-int, int יותר גדול מ-short, short יותר גדול מ-bite. מה זה אומר יותר מורכב?
לוט יותר מורכב מאינט למרות ששניהם ארבעה בתים. הוא יותר מורכב מבחינת תפיסת המידע שלו, הוא בנוי בצורה הרבה יותר מורכבת, כי הוא יכול להחזיק גם נקודה עשרונית.
אז אם אנחנו מבינים את זה, מה בעצם התוצאה שהייתה כאן? אינט, לחלק לאינט זה אינט, כי שניהם אינט, ולכן כבר כאן איבדנו את הנקודה העשרונית עוד לפני שהכנסנו את זה לתוך C.
לכן קיבלנו שתיים ולא שתיים וחצי. מה הפתרון? אנחנו צריכים שאחד מהם יהיה באיזשהו טיפוס נתונים שיוכל להחזיק נקודה עשרונית. לדוגמה, אם היינו באים ואומרים שה-a הוא דאבל.
אוקיי, דאבל לחלק לאינט, כל זה יהיה דאבל ולכן הפעולה עצמה תהיה דאבל התוצאה שלה ואז היא יכולה לשמור על הנקודה העשרונית שלה. בואו נריץ את זה, הנה קיבלנו שתיים וחצי.
מה היה קורה אם זה היה פלואוט? אז a זה פלואוט, b זה אינט, כל התוצאה זה פלואוט. פלואוט יכול לשמור על הנקודה העשרונית שלו, וכמובן יכול להיכנס לתוך c.
הנה קיבלנו שתיים וחצי. מה היה קורה אם המספר השני b היה פלואוט או דאבל? כמובן שזה גם היה מצליח, כי זה לא משנה מי מהם.
אבל מה קורה אם אני רוצה ששניהם יהיו אינטג'ר מפני שאלה המספרים שקיימים לי בקוד? אנחנו יכולים להמיר אחד מהם ל-double או ל-float.
בואו נמיר את a. ועכשיו מה שקורה זה שיש לנו כאן double לחלק ל-int. כל הדבר הזה הוא double ולכן אנחנו יכולים לשמור על הנקודה העשרונית והנה ה-2.5.
מה קורה אם אנחנו רוצים לעשות את זה אזורה כזאת זה כמובן גם אפשרות בואו נריץ ונקבל שוב שתיים וחצי אנחנו יכולים את שניהם להמיר וגם כן כאן נקבל שתיים וחצי אבל שימו לב שאם היינו עושים דבר כזה האם עדיין היינו מקבלים שתיים וחצי תשובה לא מפני שסוגריים קודמים לכל ולכן הפעולה הייתה קודם כל מתבצעת והמערכת הייתה רואה שיש לנו int ו-int אז
התוצאה הייתה int היינו מאבדים שוב פעם את הנקודה העשרונית