נרצה להבין בנוסף להמרות לבסיס בינארי כיצד ניתן לקבץ אוסף של ביטים כדי לייצג מידע. בפרט עבור מספרים שליליים.
עבור integer word שנסמנה
זה נובע מההמרות שדיברנו עליהם ושניתן לייצג כל מספר כפולינום. הסימון
הפתרון הפשוט ביותר עבור
החסרון הברור ביותר הוא שצמצמנו את כמות המספרים ויש שני ייצוגים ל
כלומר במצב של
השיטה הנפוצה כיום לייצוג מספרים שלמים שליליים.
המעבר סימן של X יהיה
כדי להמיר את המספר המיוצג לעשרוני נשתמש בנוסחה הבאה.
נוסחת ההמרה הזאת בעצם אומרת ״או שה MSB מקבל משקל שלילי וכל השאר רק ״מקטינים את ערכו״ או שהוא לא תורם בכלל.
המשמעות היא כמו במספרים שליליים בעשרוני. המספר שהיה הכי גדול בערך מוחלט יהיה הכי קטן כאשר הוא שלילי למשל עבור בייט בודד מדובר במספר
וכל הוספה של ביטים אליו רק תגדיל אותו לכיוון
נוכל לנצל את התכונה הזאת כדי להמיר מספרים המיוצגים בשיטה הזאת די מהר על ידי עבודה עם החזקות. למשל 1001000000100000 יהיה מאוד קשה להמיר בשיטה הנ״ל ולכן נוכל לקחת את
הסימון עבור הערכים המקסימלים והמינימלים בייצוג כלשהם יהיו
למשל עבור unsigned יתקיים
בעוד שעבור המשלים ל2 מתקיים
נשים לב שבייצוג זה אין שתי ייצוגים ל
כלומר אין סימטריה מלאה בין הערכים. לערך הקטן ביותר במספרים השליליים אין ייצוג חיובי למשל עבור בייט בודד ערך זה יהיה
נוכל לראות אם כן שהערך המקסימלי ביותר ב
בשפת
short int x = -15213;
unsigned short int ux = (unsigned short) x;
משמעות ההמרה היא באופן ההסתכלות על הייצוג של המספר, כלומר אם המרנו מספר שלילי למספר חיובי הרי שערכו הולך לגדול מהתמונה למעלה.
נהוג לסמן מספרי unsigned עם suffix של U למשל 429496U
.
נשים לב שבהינתן שמשלבים באותו ביטוי ובפרט ביטוי בוליאני מספר ללא סימן ומספר עם סימן תמיד תהיה המרה למספר ללא סימן וזה יכול להשפיע על נכונות הביטויים.
כאשר ננסה להמיר מספרים מגודל קטן יותר לגודל גדול יותר הקומפיילר ידעת להרחיב את הסימן באופן אוטומטי. הקומפיילר מעורב בתהליך הזה כיוון שלאחר שלב הקומפילצייה המידע מנוהל כבר כסדרות של ביטים ולכן יש חשיבות לריפוד הזה בשלב הקימפול.
א) אם מדובר ב unsigned value אז הריפוד יהיה ב
ב) אם מדובר ב signed value אז הריפוד יהיה לפי ה MSB.
נשים לב שאם אנחנו נבצע הרחבת סימן ולאחר מכן נבצע פעולות שמכילות גם unsigned וגם signed value הדבר עלול להשפיע על הערך שעבורו בוצעה הרחבת הסימן אם מדובר במספר שלילי, כאשר הוא יומר למספר ללא סימן ערכו יגדל משמעותית
unsigned
נגדיר את החיבור של שתי מספרים ללא סימן
נוכל גם להגדיר זאת כך
המשמעות היא פשוט התעלמות מה carry במידה והוא עבר את ה msb . כלומר אם נחבר מספרים שיוצאים מהטווח נקבל overflow ונבצע פעולת מודולו עם הערך המקסימלי כדי לדעת מה המספר הרצוי.
עבור
Two’s Complement Addition
נגדיר את החיבור של שתי מספרים עם סימן
נגדיר את הכפל עבור מספרים ללא סימן
עבור מספרים עם סימן נבצע את הפעולה הנ״ל ולאחר מכן נמיר לפי שיטת ההמרה שהצגנו (הפיכת הסימון והוספת 1)