שאלה על sizeof ב - c++ - תכנות - HWzone פורומים
עבור לתוכן
  • צור חשבון

שאלה על sizeof ב - c++


assaf990

Recommended Posts

אם sizefo (int) = 4

אז זה אומר שכל מספר int ייכנס במערך char באורך 5? (האחרון ל- null)

אם אני צודק אז למה הקוד הזה נותן שגיאה בטענה שחרגתי מהמערך?

int a = 123465;
char str [5];
itoa(a, str, 10); //error

קישור לתוכן
שתף באתרים אחרים

SIZEOF מחזיר את הגודל בבתים.

sizeof(int) מחזיר 4, מכיוון שהגודל של INT הוא 4 בתים(32 ביטים שנשמרים בזיכרון).

המספר המקסימאלי הוא 2^32 = 4 גיגה.

אתה צריך מחרוזת שיכולה להכיל מס תווים שמציין 4 גיגה, כלומר, 10. עוד מקום אחד ל\0 הופך ל- 11.

ד.א. לא כדאי להשתמש בITOA. תשתמש בsprintf.

ד.א. אתה לא משתמש נכון בפונקציה. הפרמטר האחרון הוא של הבסיס שאתה רוצה להמיר אליו - 2, 10, 16.


int a = 123465;
char str[11];
itoa(a, str, 10);

או


int a = 123465;
char str[11];
sprintf(str, "%d", a);

במקרה הזה מספיקה לנו גם מחרוזת באורך 7(כולל ה\0), מכיוון שהמספר 123465 בעל 6 ספרות. לא תמיד זה המספר, ולכן לקחתי את המקרה הגרוע ביותר. אם ידוע לך שהמספר יהייה תמיד בעל X ספרות או פחות, תגדיר את המחרוזת שלך כך שתהייה באורך X+1.

קישור לתוכן
שתף באתרים אחרים

אני מבולבל

אם INT זה 4 בתים אז מדוע זה לא כולל את המקרה הגרוע ביותר? מדוע לא מספיק מערך של 5 char? כלומר לא הבנתי את היחס בין העובדה ש גודל של INT הוא 4 בתים ובין המקרה הגרוע ביותר של INT שזה 2^32.

במילים אחרות: ולמה המספר הכי גדול ב INT הוא צריך לתפוס 4 גיגה? או למה אני צריך מערך גדול שיתפוס לי 4 גיגה היינו את כל האופציות של INT?

וגם לא הבנתי מדוע עדיף להשתמש ב sprintf (אגב, בשני הפונקציות נותן לי הקומפיילר "אזהרה" שלא השתמשתי בסינטאקס הנכון)

קישור לתוכן
שתף באתרים אחרים

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

sizeof(char)

אתה צריך לשמור מס ספרות כמספר הספרות שיש במספר(בבסיס עשרוני), ולכן אתה צריך לדעת כמה ספרות יכולות להיות במספר שלך.מספר הספרות הכי גדול הוא 10(4,000,000,000+ זה גיגה). כלומר, אנחנו צריכים לשמור 10 charים, כל אחד מהם ייצג ספרה במספר.

כפי שנשרשם בתראד אחר, צריך להשתמש בSTRINGSTREAM:


int myNumber = 123465;
stringstream ss;
ss<<myNumber;

const char *str = ss.str().c_str();

קישור לתוכן
שתף באתרים אחרים

הבנתי את ההסבר

כעת לא ברור לי: אז מדוע גודל של int הוא רק 4 בתים ולא כגודל המספר הכי גדול?

דבר שני: לא הבנתי את עניין ה STRINGSTREAM. מדוע חובה להשתמש בו? מה רע ב sprinf לבדו?

קישור לתוכן
שתף באתרים אחרים

שני דברים:

א) stringstream הוא type safe - תמיד יופעל הקוד המתאים לטיפוס שצוין. לא ניתן לקלוט קלט לטיפוס הלא נכון.

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

אם אתה משתמש ב-sprintf, אז עדיף שתבדוק אם יש בפלטפורמה גרסה שמקבלת את גודל המחרוזת, בסגנון snprintf.

קישור לתוכן
שתף באתרים אחרים

4 בתים = 32 ביטים בייצוג בינארי. כלומר, 32 ספרות.

אם אתה מייצג את זה בייצוג עשרוני, אתה צריך פחות ספרות לייצג. 10 למעשה.

המידע נשמר במחשב בבסיס בינארי, ואני מעוניינים לראות אותו בבסיס עשרוני.

אתה יכול לכתוב את הייצוג הבינארי למחרוזת, ואז תצטרך 33 תאים(לא לשכוח את ה\0 בסוף).

קישור לתוכן
שתף באתרים אחרים

ארכיון

דיון זה הועבר לארכיון ולא ניתן להוסיף בו תגובות חדשות.

×
  • צור חדש...