מהו טיפוס?
כעת סוף סוף יש לנו את הכלים להגדיר מהו טיפוס.
כאשר אנחנו מצהירים על משתנה מטיפוס מסוים ונותנים לו ערך, הקומפיילר עושה את הפעולות הבאות:
- מקצה תא בזכרון בגודל של הטיפוס שביקשנו
- כותב לתא הזה את הערך הרצוי
לדוגמא, נקצה משתנה int:
int x = 65;
הקומפיילר מקצה 4 בייטים בזכרון (גודל int הוא 4 בייטים) וכותב אליהם את הערך 65, או בבינארית 1000001. כלומר, תוכן הביטים בארבעת הבייטים הוא (עם רווח בין בייט לבייט):
00000000 00000000 00000000 01000001
כדוגמא נוספת, נקצה משתנה char:
char c = 65;
הקומפיילר מקצה בייט אחד (גודל char הוא בייט אחד) וכותב אליו את הערך 65, או 01000001. בהמשך נראה כיצד זה מתיישב עם הצהרות כמו 'char c = 'A שעשינו קודם.
Note
ההצגה הבינארית של משתנים מסוג
floatו-doubleמעט מורכבת יותר. למשל, ההצגה הבינארית של הצהרה כגוןfloat f = 65היא00000000 00000000 10000010 01000010- זאת מכיוון שעל מנת לייצג מספרים עשרוניים הקומפיילר מפרש את הביטים אחרת ממספרים שלמים. לא נדון בכך בקורס הזה.
פירוש ערך טיפוסים בהדפסה
#include <stdio.h>
int main() {
int x = 65;
char c = 65; // ?
printf("x = %d, c = %c\n", x, c);
}
בדוגמא זו הקומפיילר הקצה מקום לשני משתנים - x ו-c, וכתב לשניהם את הערך 65. למעשה, יש שתי כתובות בזכרון בהן ערך הבייטים הוא 65 (10000001 בבינארי - נסו להמיר בעצמכם!). מהי המשמעות של אתחול c ל-65? למה כשהדפסנו את c קיבלנו את התו A?
הסיבה לכך היא הטיפוס של המשתנה. ביקשנו להדפיס את הערך 65 פעם אחת כ-int כשהדפסנו את x, ופעם שנייה כ-char כשהדפסנו את c. כלומר, הקומפיילר מפרש את הערך 65 בתור התו A - מדוע?
לתשובה הזו יש שאלה עמוקה - נתחיל ראשית בהמרה בין סוגי משתנים ונמשיך לצורה שבה מפרשים את המספר 65 כמשתנה char.