שלום לכולם

CHOFA

New member
שלום לכולם

בס"ד ביום שישי היה לי השיעור הראשון אי פעם ב ++CC, בתור שעורי בית התבקשנו לכתוב איזושהיא תוכנה עכשיו לשאלה-אם נניח אני עושה חיסור בין שני איברים שלUNSIGNED INT והתוצאה היא שלילית מה יכתוב לי המחשב??(זו לא השאלה מהשע"ב רק משהו שאני צריכה להבין כדי שאני אדע אם יהיו לי פאקים בתוכנית.) תודה מראש.(נראה לי שבזמן הקרוב אני אכנס לפה הרבה-אז תודה מראש על הסבלנות....)
 

amni

New member
באופן כללי התוצאה השלילית

תהיה שווה מודולו M למספר האי שלילי שתחשב התוכנית. כאשר M הוא 2 בחזקת 8*L וכאשר L האורך בבייטים של מספרים UNSIGNED INT כלומר יש פה חיסור\חיבור מודולו M.
 

nahsh

New member
דברים ברמה הזאת, אין טעם לשאול -

פשוט כותבים תוכנית קצרה ומנסים. זאת הדרך הכי טובה ללמוד.
 

nahsh

New member
סתם. אחרי שניסיתי עכשיו - הנה

התשובה: התשובה היא כמובן - תלוי. תלוי לאן נכנסת התוצאה. תוצאות של פעולות חשבוניות בין שלמים הן כברירת מחדל int, גם אם האופרנדים הם לא int (short, char, unsigned וכד´) בכל אופן, אם התשובה נכנסת לתוך unsigned, היא תשאר unsigned, והפוך. אם התוצאה "נשארת באוויר" - תוצאת ביניים של חישוב - זה יחשב כint. רק הסתייגות אחת - דברים כאלה משתנים לפעמים מקומפיילר אחד לשני, וצריך לשים לב ולבדוק.
 

amni

New member
זו שאלה לספר REFFERENCE

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

galh

New member
למה אף אחד? חשבתי שאתה לומד... ../images/Emo13.gif

לגבי השאלה שלך, חיסור של שני מספרים מסוג unsigned לתוך משתנה מסוג unsigned יגרום לתוצאה של מספר "נורא" גבוה. משהו שתקבל אם תקח את הערך הגבוה ביותר שהמשתנה יכול לקבל פחות תוצאת החיסור. הסיבה לכך היא צורת ייצוג המספרים במעבד (ולא תלוי כל כך בקומפילייר) שהוא בצורה בינארית. אם אתה מתכנן ללמוד ++C בצורה רצינית, מאוד ממולץ ללמוד את הנושא של בסיס בינארי ואלגברה בוליאנית.
 

CHOFA

New member
קודם כל

בס"ד תודה על התשובות אבל..... כיוון שבחיים שלי לא נגעתי בנושא של מחשבים(ואני די מתחילה להבין למה) את ההסברים שלכם אני צריכה שתסבירו כמו לילדה מפגרת. נניח שעשיתי חיסור בין 1 ל 3 התוצאה היא כמובן(2-) למדנו כבר שאם נניח מחלקים 2 מספרים מסוג INT התוצאה תופיע בשלמים ובלי שארית כך שהתוצאה של 9:4תהיה 2 אבל נניח שהתרגיל הוא כמו למעלה:3-1 והמשתנה הוא UNSIGNED INT מה אז תכתוב התוכנית??? (ונכון שהכי פשוט זה לכתוב ולנסות אבל כרגע אני לא באוניברסיטה ואני מנסה להבין ת´רעיון של התוכנית לפני שאני אגש לכתוב אותה.) אז שוב תודה...
 

amni

New member
הרעיון הוא פעולות מודולו

תילמד באיזשהו ספר מהן חיבור\חיסור מודולו M וכן תילמדי חישוב מנות שספרים שלמים (מודולו ערך מוחלט של המכנה) ואז תביני את ה"הגיון" של החישובי שעושה המחשב. כמו כן את צריכה ללמוד לקומפיילר שלך את הייצוג בביטים של מספרים מטיפוסים שונים (לצורך השאלה שלך מטיפוס UNSIGNED ). זה הרבה יותר יותר קל ממה שזה נשמע, אבל צריך ללמוד את זה באופן מסודר.
 

KaZaA

New member
גישה חדשה לבעיה שלך...

פעולת חיסור (כמו כל פעולת חשבון אחרת בתוכנה שלך) לא יכולה לעמוד באוויר - כלומר היא חייבת להיות או מוצבת בתוך משתנה מסוים או מועברת לפונקציה (שזה בעצם שקול להצבה בתוך משתנה שנמצא בפונקציה). תוצאת פעולה בין שני UNSIGNED INTEGER אינה בהכרח מאותו סוג (כמו שפעולת חילוק של שני שלמים אינה בהכרח שלם!) - ולכן מתבצעת פעולת המרה בין סוגי משתנים (דבר המכונה casting)... פעולה זו היא פעולה בעייתית לעיתים ולעיתים היא אפילו בלתי צפויה - ולכן יש להזהר בה... בכל אופן הקומפילר מנסה לבצע את מיטב יכולתו. לעיתים פעולת ההמרה הזו משמעה להסתכל על הזכרון של המחשב (כלומר מצב הסיביות בבתי הזכרון במחשב) במשקפיים שונות - כדי להבין זאת צריך לדעת אלגברה בוליאנית (דהיינו הצורה בה מייצגים מספרים במחשב בבסיס בינארי). אם נושא זה לא כלול בחומר הלימוד אין טעם שתתעמקי בו - אך בכל אופן אני ממליץ לך במקביל ללמוד נושא זה כי הוא הכרחי להבנת מקצוע התכנות בכלל ושפת C בפרט... אני מקווה שהתשובה הזו תבהיר לך קצת את המצב...
 
למעלה