המרות בין טיפוסים (Conversions)

סגור באמצעות טופס זה תוכלו לספר ולהמליץ לחבריכם..
שם השולח:
כתובת דוא"ל של השולח:
שם המקבל:
שלח לכתובת דוא"ל:
הוסף הערה:
"היהפוך כושי עורו, ונמר חברבורותיו" (ירמיהו כ"ג)? בחיים אולי לא, אבל תתפלאו כמה פעמים זה קורה בעולם התכנות.



המרות בין טיפוסים (Conversions) 

 
מאת: ארז קלר
 
 
 
"היהפוך כושי עורו, ונמר חברבורותיו" (ירמיהו כ"ג)?
בחיים אולי לא, אבל תתפלאו כמה פעמים זה קורה בעולם התכנות.
כושי לא יכול להמיר את עורו בעור לבן (אלא אם קוראים לך מייקל ג'קסון),
אבל בתכנות ניתן להמיר string ל-int ולהיפך.
נמר לא ימיר את חברבורותיו בפרווה חלקה, אבל בתכנות ניתן להמיר  double ל-int או ל-float
לא רק שניתן, זה אפילו נחוץ ואף הכרחי בלא מעט מקרים.
אבל זהירות, זה גם יכול להיות מסוכן, לגרום לאבדן מידע במקרים מסוימים, ומזה אנחנו מאוד רוצים להימנע.
דוגמת קוד  (ConversionSample)
 1  : class Program 
 2  : { 
 3  :    static void Main(string[] args) 
 4  :     { 
 5  :         int num = 1234; 
 6  :         string int_str = num.ToString(); 
 7  :         Console.WriteLine("int_str = " + int_str); 
 8  :         
 9  :         double dnum = 123.456; 
 10 :         string double_str = dnum.ToString(); 
 11 :         Console.WriteLine("double_str = " + double_str); 
 12 :         
 13 :         int_str = "456"; 
 14 :         num = int.Parse(int_str); 
 15 :         Console.WriteLine("int_str = " + num); 
 16 :          
 17 :         double_str = "456.789"; 
 18 :         dnum = double.Parse(double_str); 
 19 :         Console.WriteLine("double_str = " + dnum); 
 20 :          
 21 :         float fnum = 123.345f; 
 22 :         Console.WriteLine("fnum = " + fnum); 
 23 :          
 24 :         short snum = 12345; 
 25 :         num = snum; 
 26 :         Console.WriteLine("num = " + num); 
 27 :          
 28 :         num = 56789; 
 29 :         snum = (short)num; 
 30 :         Console.WriteLine("snum = " + snum); 
 31 :  
 32 :     } 
 33 : } 

בכל הטיפוסים הקיימים מוגדרת מתודה שנקראת ()ToString, המתודה הזו ממירה ערך כלשהו למחרוזת.
()int.ToString – ממירה מספר למחרוזת נומרית, 123 הופך ל-"123"
()float.ToString – ממירה ערך ממשי למחרוזת מומרית, 123.456 הופכת ל-"123.456".
()char.ToString – ממירה תו למחרוזת בת תו בודד, 'a' הופך ל-"a".
וזה נכון לגבי כל הטיפוסים הקיימים ב-#C.
בשורה 6 נמיר באמצעות ()int.ToString מספר שלם למחרוזת נומרית.
ובשורה 10 נמיר באמצעות ()double.ToString מספר ממשי למחרוזת נומרית.
עד כה, בדוגמה, המרנו מספרים למחרוזות, לעיתים קרובות נידרש לעשות גם את ההיפך,
להמיר מחרוזת נומרית למספר.
את זה נוכל לבצע באמצעות המתודה Parse אשר קיימת בכל הטיפוסים המספריים.  
המתודה Parse מקבלת כפרמטר מחרוזת נומרית וממירה אותו למספר.
(int.Parse(string – ממירה מחרוזת נומרית למספר שלם.
(float.Parse(string ממירה מחרוזת נומרית למספר ממשי.
(char.Parse(string – ממירה מחרוזת בעלת תו בודד ל-char (זוכרים ש-char הוא גם נומרי? זוכרים את Unicode?)
וזה נכון לגבי כל הטיפוסים הנומריים הקיימים ב-#C.
בשורה 14 נמיר באמצעות ()int.Parse מחרוזת נומרית למספר שלם.
ובשורה 18 נמיר באמצעות ()double.ToString מחרוזת נומרית למספר ממשי.
בשורה 21 נגדיר ונאתחל משתנה חדש מהטיפוס float.
ערכו של המשתנה החדש יהיה 123.456, שימו לב שצמוד למספר יש את האות f.
אם נסיר את התו f נקבל שגיאה:
Conversion Error

מה המשמעות שלה?
שלא ניתן להמיר את המספר בצורה מרומזת ללא שימוש ב-f.
למה זה קורה?
מבחינת התוכנית המספר 123.456 הוא למעשה מהטיפוס double כברירת מחדל.
double יכול להביל מספר גדול יותר ומדויק יותר (מספר הספרות אחרי הנקודה) מאשר float,
ולכן יש סכנה של איבוד מידע, של קיצוץ ערכו של הנתון כדי שיתאים ל-float.
בהודעת השגיאה Visual Studio מודיע לנו שעלינו לבצע המרה מפורשת, כלומר לציין בצורה מפורשת שלזה אנחנו מתכוונים ומודעים לסכנה.
 ואם היינו רוצים להמיר float ל-double? האם הייתה סכנה כלשהי? האם היינו מקבלים הודעת שגיאה?
השורות הבאות מדגימות זאת שוב, הפעם עם הצמד חמד int ו-short.
שניהם טיפוסים שיכולים להכיל מספר שלם,
טווח המספרים של int גדול בהרבה מטווח המספרים של int.
דהיינו, כל ערך שקיים ב-short יכול להיות מיוצג גם על ידי int.
וההיפך?, האם כל ערך שקיים ב- int יכול להיות מיוצג גל על ידי short? ברור שלו.
מכאן ניתן להסיק שאין שום בעיה להמיר short ל-int ואפשר להשתמש בהמרה מרומזת (implicit) כמו המודגם בשורה XXX, כלומר, פשוט להמיר מבלי להתייחס לכך בצורה מפורשת.
ההיפך, הוא מסוכן, ולכן  חייבים להמיר בצורה מפורשת (Explicit) ולציין שאנו מתכוונים להמרה.


פלט:
פלט התוכנית ConversionSample


 
 


 
 
 
הכונן הקשיח הראשון
השנה 1956, IBM מציגה את המחשב הראשון עם הדיסק הקשיח.
שקל המון, עלה הרבה, נתן מעט.
מפתיע?
 
הכונן הקשיח הראשון