טיפוסי משתנים למספרים שלמים (integer) בארדואינו

- עמוד זה הוא חלק מהמדריך לפונקציות ארדואינו -

במערכות מחשוב מודרניות, כולל מיקרו-בקרים, משתנים שהם מספרים שלמים (כלומר אינם מסוגלים להכיל שברים או נקודה עשרונית) נשמרים בייצוג בינארי ביחידות זיכרון שגודלן הוא 8 ביטים כפול חזקה כלשהי של 2. מספר הביטים קובע את הערך המקסימלי שהמשתנה יכול לקבל, וכאשר הייצוג כולל סימן (מינוס או פלוס), גם את הערך המינימלי:

  • ערך מינימלי בייצוג ללא סימן: 0
  • ערך מקסימלי בייצוג ללא סימן: 2 בחזקת מספר הביטים, פחות 1.
  • ערך מינימלי בייצוג עם סימן: (2 בחזקת מספר הביטים, חלקי 2)-
  • ערך מקסימלי בייצוג עם סימן: 2 בחזקת מספר הביטים, חלקי 2, פחות 1.

לדוגמה:

ערכי מינימום ומקסימום של טיפוסי integer שונים, לפי מספר ביטים וסימן

מסיבות היסטוריות, יש דרכים רבות לציין את השילוב של מספר ביטים ושל סימן – והמשמעות שלהן משתנה בין פלטפורמות, שפות תכנות וקומפיילרים שונים. בדף זה נתמקד באופני הסימון של שפות התכנות 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] charint8_t
unsigned charuint8_t
byteuint8_t
[signed] short / intint16_t
unsigned short / intuint16_t
worduint16_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 בקומפיילר הספציפי איתו עובדים. לקומפיילרים שונים יש ברירות מחדל שונות, ובאג שמקורו באי-הבנה שכזו עלול להיות קשה ביותר לגילוי.

הערה

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

בלוג אישי בנושאי מייקינג, תכנות, מיקרו-בקרים ואלקטרוניקה