לוגו אתר Fresh          
 
 
  אפשרות תפריט  ראשי     אפשרות תפריט  צ'אט     אפשרות תפריט  מבזקים     אפשרות תפריט  צור קשר     חץ שמאלה ‎print ‎"Hello World!"; if‎ ‎not rules.‎know ‎then rules.‎read(); חץ ימינה  

לך אחורה   לובי הפורומים > מחשבים > תכנות ובניית אתרים
שמור לעצמך קישור לדף זה באתרי שמירת קישורים חברתיים
תגובה
 
כלי אשכול חפש באשכול זה



  #1  
ישן 26-10-2009, 23:37
צלמית המשתמש של MatiM
  משתמש זכר MatiM MatiM אינו מחובר  
 
חבר מתאריך: 12.04.06
הודעות: 2,021
שלח הודעה דרך MSN אל MatiM
מספרים מסומנים (signed / unsigned), וfloat

אשמח לקבל הסבר שמציג מה ההבדל בין משתנה מסוג signed למשתנה מסוג unsigned.

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

אני רוצה הסבר על העניין של הסיבית השמאלית ביותר ש"מסמנת" את המספרים וקובעת האם הם שליליים או חיוביים.

כשאני ממיר מספר מבינארית לעשרונית, הוא תמיד חיובי.
איך מספר בינארי נהפך לשלילי?
ואם אני מכניס מספר שנחשב שלילי בבינארית (לדוגמא; 1001) כיצד הקומפיילר מתייחס אליו גם כשלילי וגם כחיובי?


-------

והשאלה בנוגע לfloat היא -

איך המחשב מתייחס למשתנה מסוג כזה? [מבחינת גודל שמוקצה בזיכרון].

שוב, מבחינה בינארית, איך הוא יכול לשמור בזיכרון משתנה "לא שלם"?
שהרי כשממירים מספר בינארי לעשרוני, הוא תמיד שלם.




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


תודה, לילה טוב
_____________________________________
תמונה שהועלתה על ידי גולש באתר ולכן אין אנו יכולים לדעת מה היא מכילה

תגובה ללא ציטוט תגובה עם ציטוט חזרה לפורום
  #2  
ישן 27-10-2009, 01:55
  trialusert trialusert אינו מחובר  
 
חבר מתאריך: 25.09.09
הודעות: 63
בתגובה להודעה מספר 1 שנכתבה על ידי MatiM שמתחילה ב "מספרים מסומנים (signed / unsigned), וfloat"

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

אבל רגע, יש בעיה! איך המחשב יידע להפוך מספר חיובי לשלילי?
נכון, נסתכל על החישוב הבא ("מינוס" 45 פלוס 45):

0010,1101 +
1010,1101

לכאורה אמורה להתקבל התוצאה 0000,0000 , אבל הדרך הזו שגויה. לכן משתמשים בשיטה הנקראת שיטת המשלים ל-2.

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

ננסה לייצג את מינוס 45 בעזרת השלבים:

1) 1101,0010 +
2) 1
= 1101,0011

כעת, תתקבל תוצאה נכונה אם נחזור על פעולת החישוב (מינוס 45 פלוס 45).
תגובה ללא ציטוט תגובה עם ציטוט חזרה לפורום
  #3  
ישן 27-10-2009, 15:24
צלמית המשתמש של MatiM
  משתמש זכר MatiM MatiM אינו מחובר  
 
חבר מתאריך: 12.04.06
הודעות: 2,021
שלח הודעה דרך MSN אל MatiM
תודה על ההסבר המפורט
בתגובה להודעה מספר 2 שנכתבה על ידי trialusert שמתחילה ב "המחשב אכן מבדיל בין 2 סוגי..."

אני לא מבין. אז בעצם

קוד:
211 = -45


?

הרי כשאני ממיר את 11010011 אני מתייחס אליו כמספר חיובי, אז פתאום מתברר שהוא בכלל מייצג מספר שלילי שונה ממה שאני רוצה?


למרות שפעולת החיסור אכן הגיונית כי אם המספר זהה [פלוס ומינוס], התוצאה היא אפס,
אבל - בעצם המחשב לא מתייחס לזה באופן שהמתכנת רוצה שהוא יתייחס לזה?




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

ניכנסתי למחשבון של וידנוס [התחל > הפעלה > calc ]

הפעלתי תצוגה מדעית.

כתבתי תחת Dec את המספר -45 (מינוס ארבעים וחמש).

לחצתי שווה. (רק כדי שהוא יכניס לזכרון).

עכשיו, לחצתי על BIN והמספר אומר כמו שאמרת - התהפך, ונוסף לו אחד.

ועכשיו - רציתי לבדוק אם המחשבון יתייחס לזה באמת כמספר שלילי, לחצתי שוב על Dec - ו...

בעיה! המחשב בעצמו לא יודע לשחזר את המספר שהוא יצר למספר שלילי.

התוצאה שנכתבה היא: 18446744073709551571



עכשיו תגידו שהמחשב הוסיף את ה0, ואז הפך ל1 את כל הסיביות אז המספר השתנה ובגלל זה התקבל המספר החדש,

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


אם היה לכל תא בזכרון סיבית לsign [נניח כמו sign flag באוגרים, אלא שיהיה לכל תא זיכרון] - הייתי מבין, ואז כשיש בה 1 זה מספר שלילי.
אבל אם הוא משנה את כל המספר, לערך שבני אדם לא יודעים לקרוא אותו (בצורה שלילית), מה ההיגיון?
_____________________________________
תמונה שהועלתה על ידי גולש באתר ולכן אין אנו יכולים לדעת מה היא מכילה


נערך לאחרונה ע"י MatiM בתאריך 27-10-2009 בשעה 15:31.
תגובה ללא ציטוט תגובה עם ציטוט חזרה לפורום
  #4  
ישן 27-10-2009, 13:19
  משתמש זכר eXtruct eXtruct אינו מחובר  
 
חבר מתאריך: 27.10.05
הודעות: 1,067
בתגובה להודעה מספר 1 שנכתבה על ידי MatiM שמתחילה ב "מספרים מסומנים (signed / unsigned), וfloat"

המחשב לא מבדיל בין מספר שלילי ומספר חיובי, בשבילו זה אוסף של סיביות. מה שכן הוא יודע לעשות פעולות על שני המספרים ככה שהתוצאה תיהיה נכונה (נראה לי שה ALU מתפל בזה). כלומר המתכנת אומר למעבד משהוא בסגנון "אני רוצה שתחבר לי את מספר א' עם מספר ב' ותייחס לשניהם כאל מספרים שליליים". דוגמא לזה: פקודת ASM שנראת MUL מתייחסת לשני אופרנדים כאל מספרים חיוביים אפילו עם תנסה להכפיל -45 ב 2 אתה לא תקבל את התוצאה שאתה מצפה לה כי הפקודה מתעלמת מסימן. לעומתה הפקודה IMUL אכן נותן חשיבות לסימן של המספר וכלן בדוגמא הנ"ל התוצאה תתקבל כמו שאתה מצפה.
עכשיו לגבי איך זה נשמר בזכרון:
כמו שהבחור מעלי אמר הביט הכי שמאלי הוא זה שקובע את הסימן, כאשר 0 מסמל מספר חיובי ו 1 מספר שלילי.

פה יש הסבר על FLOAT
http://cdatatype.blogspot.com/2008/...loatdouble.html
תגובה ללא ציטוט תגובה עם ציטוט חזרה לפורום
תגובה

כלי אשכול חפש באשכול זה
חפש באשכול זה:

חיפוש מתקדם
מצבי תצוגה דרג אשכול זה
דרג אשכול זה:

מזער את תיבת המידע אפשרויות משלוח הודעות
אתה לא יכול לפתוח אשכולות חדשים
אתה לא יכול להגיב לאשכולות
אתה לא יכול לצרף קבצים
אתה לא יכול לערוך את ההודעות שלך

קוד vB פעיל
קוד [IMG] פעיל
קוד HTML כבוי
מעבר לפורום



כל הזמנים המוצגים בדף זה הם לפי איזור זמן GMT +2. השעה כעת היא 02:56

הדף נוצר ב 0.06 שניות עם 10 שאילתות

הפורום מבוסס על vBulletin, גירסא 3.0.6
כל הזכויות לתוכנת הפורומים שמורות © 2024 - 2000 לחברת Jelsoft Enterprises.
כל הזכויות שמורות ל Fresh.co.il ©

צור קשר | תקנון האתר