שְׁאֵלָה:
מדוע אינט רק 2 בתים?
Peter Bloomfield
2014-02-20 17:37:03 UTC
view on stackexchange narkive permalink

בעת שימוש ב- C / C ++ בפלטפורמות אחרות, הסוג int הוא בדרך כלל 4 בתים (או פוטנציאל יותר). עם זאת, בארדואינו מדובר ב -2 בתים בלבד.

מדוע זה שונה? האם זה משפיע על הביצועים אם אני תמיד משתמש במקום זאת ב -4 בתים long ?

שים לב ש- int הוא 4 בתים ב- Arduino Due. 'קצר' יהיה 2 בתים בכל הארדוניוס הקיימים, אך אני מדגיש את העצה של האחרים להשתמש ב- 'int16_t' או 'uint16_t'.
שתיים תשובות:
#1
+10
Cybergibbons
2014-02-20 19:55:45 UTC
view on stackexchange narkive permalink

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

לכן, רוב הפעולות מטפלות בכל 8 סיביות. עבודה על כל דבר מלבד 8 סיביות (כלומר מספרים שלמים של 16 סיביות או 32 סיביות ומספרי נקודה צפה) דורשת מה שבעצם ניתן לתאר כהדמיית תוכנה, כאשר המהדר משתמש בהוראות מרובות לעבודה על המשתנים הגדולים יותר. p> 8 סיביות הוא כמובן מספיק כדי לטפל ביציאת 8 סיביות. זה גם מספיק כדי להתמודד עם דלפקי לולאה רבים, ערכי החזרה ותווים ASCII. זה לא ממש מספיק כשמדובר במספרים. אינט חתום של 8 סיביות (int8_t) יכול לייצג רק -128 -> +127. לא חתום (uint8_t) יכול לייצג רק 0 -> 255.

מספרים שלמים של 8 סיביות הם די מגבילים. C / C ++ int חייב לייצג לפחות -32,678 -> +32,767 כך שמפות ל- int16_t - הגודל הקטן ביותר שיעשה זאת. זה נותן איזון טוב בין טווח ויעילות. זה חשוב במיוחד כאשר מתחילים לומדים - הצפה אינה באמת דבר שאינם מתכנתים מבינים. פעולה של 8 סיביות, ומשתמשים בכמות גדולה ביותר של רושמים. זה עשוי או לא עשוי להשפיע עליכם.

רבים מאיתנו עוברים לסוגים המקוריים כגון int8_t ו- uint8_t מכיוון שזה נותן לך שליטה רבה יותר.

רק הערה: לא צוות Arduino מיפה int ל- int16_t, "int" היא מילת מפתח שמורה ל- C / C ++, ומיפוי הסוגים הוא חלק מ- ABI (http://gcc.gnu.org/wiki/avr- gcc) שמפתחי מהדר ה- avr-gcc החליטו לעקוב אחריהם. הבדל בולט נוסף הוא בסוג ה"כפול "שלרוב הוא רוחב 64 סיביות, ואילו ב- avr-gcc הוא 32 סיביות כמו" צף "
תודה. לא בטוח למה כתבתי את זה. אני יודע ש- int חייבת לייצג 32,678 -> +32,767 (אם כי, למעשה, אני חושב שהיה מהדר קנייני לאחד ממעבדי ה- NEC שלא פעל לפי זה). אני חושב שזה בגלל שאני לא אוהב להסתיר רוחבים במערכות משובצות - השימוש ב- int16_t הרבה יותר ברור.
+1 לשימוש בסוגים מקוריים ברורים! ב- Arduino Due, 'int' הוא 32 סיביות! http://arduino.cc/en/Reference/int
#2
+3
jfpoilpret
2014-02-21 00:37:00 UTC
view on stackexchange narkive permalink

עובדה חשובה אחת בשפות C ו- C ++ היא שהסטנדרטים שלהם בהתאמה אינם מגדירים את הגודל (בבייטים) של סוגי המספרים האינטגרליים והנקודות הצפות.

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

  טווח (קצר) < = range (int) < range (long)  

אז הגודל של למשל int בדרך כלל תלוי ב:

  • פלטפורמת היעד (מעבד)
  • המהדר עצמו
אתה אומר ש- 'sizeof (קצר) == sizeof (int) == sizeof (ארוך)' אפשרי?
@ron-e תיאורטית, כן, זה יהיה אפשרי. אולם בפועל מעולם לא ראיתי זאת. ברוב המהדרים / פלטפורמות, אפשר היה לצפות (אם כי לא מוטל) ש- 'sizeof (קצר)


שאלה ותשובה זו תורגמה אוטומטית מהשפה האנגלית.התוכן המקורי זמין ב- stackexchange, ואנו מודים לו על רישיון cc by-sa 3.0 עליו הוא מופץ.
Loading...