- עמוד זה הוא חלק מהמדריך לפונקציות ארדואינו -
במערכות מחשוב מודרניות, כולל מיקרו-בקרים, משתנים שהם מספרים שלמים (כלומר אינם מסוגלים להכיל שברים או נקודה עשרונית) נשמרים בייצוג בינארי ביחידות זיכרון שגודלן הוא 8 ביטים כפול חזקה כלשהי של 2. מספר הביטים קובע את הערך המקסימלי שהמשתנה יכול לקבל, וכאשר הייצוג כולל סימן (מינוס או פלוס), גם את הערך המינימלי:
- ערך מינימלי בייצוג ללא סימן: 0
- ערך מקסימלי בייצוג ללא סימן: 2 בחזקת מספר הביטים, פחות 1.
- ערך מינימלי בייצוג עם סימן: (2 בחזקת מספר הביטים, חלקי 2)-
- ערך מקסימלי בייצוג עם סימן: 2 בחזקת מספר הביטים, חלקי 2, פחות 1.
לדוגמה:
מסיבות היסטוריות, יש דרכים רבות לציין את השילוב של מספר ביטים ושל סימן – והמשמעות שלהן משתנה בין פלטפורמות, שפות תכנות וקומפיילרים שונים. בדף זה נתמקד באופני הסימון של שפות התכנות C ו-C++, אך גם בהן הסימון אינו אחיד.
אופן סימון מומלץ
כדי למנוע בלבולים ואי-הבנות, אם הקומפיילר מודרני מספיק כדי לאפשר זאת, מומלץ מאד לעבוד בשיטה שמציינת את מספר הביטים במפורש. הדבר נעשה באמצעות התבנית:
[u] + int + 8/16/32/64 + _t
האות u האופציונלית מציינת טיפוס משתנה ללא סימן (unsigned). אם היא אינה מופיעה, המשתנה מוגדר כברירת מחדל כבעל סימן. לאחר מכן מופיע הצירוף הקבוע int (קיצור של Integer, מספר שלם), אחריו מספר הביטים, ולסיום קו תחתון והאות t.
לדוגמה, int8_t הוא טיפוס משתנה של מספר שלם בן 8 ביטים עם סימן, ואילו uint32_t הוא טיפוס משתנה של מספר שלם בן 32 ביטים, ללא סימן.
אופן סימון מסורתי
הדרך הרגילה לציין טיפוסי משתנים של מספרים שלמים היא בשילוב של מילות המפתח הבאות:
- signed / unsigned לציון טיפוס משתנה עם או בלי סימן
- char לציון טיפוס משתנה בן 8 ביטים
- short / int / long / long long לציון טיפוסי משתנים בגודל 16 ביטים (לפחות) ומעלה, בהתאם לפלטפורמה ולקומפיילר
אופן סימון בארדואינו
בטבלה הבאה מוצגים אופני הסימון המוכרים על ידי סביבת הפיתוח של ארדואינו, והמקבילים להם באופן הסימון המומלץ שהוצג למעלה. הסוגריים המרובעים (“[]”) מציינים מילת מפתח אופציונלית, וקו נטוי (“/”) מציין ברירה בין מילת המפתח שלפניו לזו שאחריו.
הגדרה בארדואינו | מקבילה ל- |
[signed] char | int8_t |
unsigned char | uint8_t |
byte | uint8_t |
[signed] short / int | int16_t |
unsigned short / int | uint16_t |
word | uint16_t |
[signed] long [int] | int32_t |
unsigned long [int] | uint32_t |
[signed] long long [int] | int64_t |
unsigned long long [int] | uint64_t |
המלצות חשובות
- בעבודה עם מיקרו-בקרים, אלא אם יש סיבה טובה מאד לנהוג אחרת, מומלץ להגדיר את כל המשתנים המספריים השלמים כחסרי סימן (unsigned)
- אם בוחרים באופן הסימון המסורתי להגדרת טיפוסי משתנים, יש לציין במפורש signed או unsigned, ולבדוק היטב את המשמעות של int, short ו-long בקומפיילר הספציפי איתו עובדים. לקומפיילרים שונים יש ברירות מחדל שונות, ובאג שמקורו באי-הבנה שכזו עלול להיות קשה ביותר לגילוי.
הערה
שפות תכנות מסוימות מציעות טיפוסי מספרים שלמים גמישים, שאינם מוגבלים מראש על ידי מספר ביטים. במקרים כאלה, המימוש המורכב של אחסון המידע ושל חישובים מתמטיים מבוצע בתוכנה ואינו קבוע בחומרה.