overflow

kobyp2

New member
overflow

היי,

1. איך מוגדר overflow ?
2. למה מחיבור של שני מספרים חיוביים בשיטת המשלים ל2 מתקבל overflow ?

תודה למשיבים
 

פרסאוס

New member
overflow הוא שינוי סימן בערך

כאשר אנחנו רוצים להתייחס לערכים עם סימן (ז"א לאפשר שימוש במספרים שליליים),
אנחנו משתמשים בשיטת משלים ל2.
מבחינת המעבד, השיטה הזאת ריאלית מורידה ביט אחד (העליון) מהאוגר בו אנחנו משתמשים.
אם 8 ביט אז במקום 255 ערכים יהיו 127+- וכן הלאה.
כעת, אם ננסה להשתמש באוגר AL לדוגמא כדי לבצע חישוב כזה:
85+95
נקבל תאורטית 175, אבל מעשית, היות והערך מסומן, יש לנו 81-.
ניסינו לחבר שני ערכים חיוביים וקיבלנו ערך שלילי.
כל שינוי שכזה בסימן של התוצאה מעלה את דגל הגלישה, גם מקרה הפוך.

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

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

פרסאוס

New member
על זה צריך לפרט

ראשית, אני מניח שהשואל לא התכוון לחריגים.
שנית, כאשר חורגים מהגודל הכללי של התא נקרא לפעולה דגל הנשא.
דגל זה לא יקרא לפעולה כאשר אין חריגה מהגודל הכללי.
האם זה יפעיל דגל גלישה? אם תהיה חלופה בסימן אז כן.
אבל אם לא, אז לא, כך שטעות בידיך.
נסה להוסיף 10 ל 120 בתוך AL
ואז 200 ל 120 בתוך AL.
במקרה הראשון תראה את דגל הגלישה דולק (סיבית 11) ובמקרה השני, למרות שדגל הנשא דולק, דגל הגלישה יהיה כבוי.
 
בקריאה חוזרת, כנראה לא הבנתי נכון את השאלה

לא שמתי לב שהוא שואל על אסמבלי, ועניתי באופן יותר כללי - int overflow, stack overflow וכו'
 

selalerer

New member
יש פעולה ויש תוצאה.

אם התוצאה חורגת ממה שניתן לשמור בזיכרון שבו שמים את התוצאה, יש overflow.

בד"כ כל זה קורה בתוך המעבד, באוגרים, ולא בזיכרון אחר.
 
למעלה