סדר בתים

מתוך ויקיפדיה, האנציקלופדיה החופשית
קפיצה אל: ניווט, חיפוש

במחשוב, המונח סדר בתים (באנגלית: Byte Order, או Endianness) מציין את האופן בו נשמרים ערכים של מספרים שלמים בזיכרון מחשב.

רקע[עריכת קוד מקור | עריכה]

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

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

ייצוג שלמים במחשב[עריכת קוד מקור | עריכה]

מספרים מיוצגים בזיכרון המחשב בצורה בינארית, כלומר על ידי רצפים של סיביות. מאז נתקבעה המוסכמה, כמעט כל המספרים בכל המחשבים מיוצגים על ידי מספר שלם של בתים, או במילים אחרות, מספר הסיביות שלהם הוא כפולה של 8. הגדלים הנפוצים ביותר הם מספרים המיוצגים על ידי בית יחיד, שני בתים, ארבעה או שמונה. כאשר מספר שלם מיוצג על ידי מספר בתים (כלומר יותר מבית אחד), אחד הבתים הוא הבית "המשמעותי ביותר", ואחד הבתים "הפחות משמעותי". הגדרות אלו שקולות לייצוג הספרות במספר עשרוני. למשל במספר ארבע ספרתי נאמר שספרת האלפים היא "המשמעותית ביותר", וספרת האחדות היא ה"פחות משמעותית". נפוצים בעיקר שני סוגים של "שלמים" במחשב: שלמים "ללא סימן" (unsigned), ושלמים עם סימן (signed). עבור שלמים עם סימן, שיטת הייצוג המקובלת נקראת משלים ל-2. שלם המיוצג בבית יחיד ללא סימן יכול לייצג ערכים בין 0 ל-255, בעוד שבשיטת משלים ל-2, בית יחיד יכול לייצג ערכים בין 128- ובין 127. הטבלה הבאה מציגה את גדלי השלמים הניתנים לייצוג, כתלות במספר הבתים:

מספר הבתים תחום המספרים ללא סימן תחום המספרים בשיטת משלים ל-2
1 0 עד 255 128- עד 127
2 0 עד 65,535 32,768- עד 32,767
4 0 עד 4,294,967,295 2,147,483,648- עד 2,147,483,647
8 0 עד 18,446,744,073,709,551,615 9,223,372,036,854,775,808- עד 9,223,372,036,854,775,807

קיימות שיטות נוספות לייצג שלמים במחשב, אך האמור בערך הזה מתייחס לשתי השיטות המקובלות - ללא סימן או משלים ל-2.

הגדרת סדר הבתים[עריכת קוד מקור | עריכה]

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

בשתי השיטות, הכתובת של המספר כולו נחשבת הכתובת הקטנה: במקרה של Big Endian זו כתובתו של הבית המשמעותי ביותר, ובמקרה של Little Endian זו כתובתו של הבית הפחות משמעותי.

דוגמה[עריכת קוד מקור | עריכה]

ניקח לדוגמה שלם המיוצג ב-16 סיביות, או שני בתים (כאמור, יש גם שלמים המיוצגים על ידי בית בודד, ארבעה, או שמונה בתים). לצורך הדוגמה נסתכל על המספר 6716. מספר זה נכתב בבסיס ספירה 16, או הקסאדצימלי, כ-0x1A3C. משמעות הדבר היא שהבית המשמעותי יותר הוא 0x1A (או 26 בכתיבה עשרונית), והבית הפחות משמעותי הוא 0x3C (או 60 בכתיבה עשרונית).

המחשב שומר מספר זה בכתובת זיכרון כלשהי, נקרא לה A: במחשב המשתמש בסדר בתים Little Endian, בכתובת A יישמר 0x3C, ובכתובת A+1 יישמר 0x1A, ואילו במחשב המשתמש בשיטת Big Endian, בכתובת A ישמר הערך 0x1A, ואילו ב-A+1 ישמר 0x3C.

האיור להלן מדגים איך ישמר המספר 168496141 או בבסיס 16 0x0A0B0C0D בייצוג של 32 סיביות (ארבעה בתים) במחשבים המשתמשים בשתי השיטות.

(שימו לב ש"הכתובת הקטנה" מופיעה בחלק העליון של האיור)

ישנם מעבדים המסוגלים לפנות לזיכרון בשתי השיטות (בדרך כלל השיטה שבשימוש בכל רגע נתון נשלטת על ידי אחת הסיביות ב"אוגר הדגלים"). דוגמאות למעבדים כאלו הם Alpha של DEC, ‏PowerPC של IBM, ‏SPARC V9 של סאן מיקרוסיסטמס, ‏ ARM ועוד.

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

גם בתקשורת מחשבים מסוג IP עובדים בשיטת סדר בתים גדול.

אטימולוגיה[עריכת קוד מקור | עריכה]

מקור המונחים Little-Endian ו-Big-Endian באנגלית הוא הרומן הסטירי משנת 1726, מסעי גוליבר של ג'ונתן סוויפט, והוכנס לשימוש במשמעות של סדר בתים על ידי דני כהן בשנת 1980.

ברומן של סוויפט מתארת מלחמה בין ממלכת ליליפוט לשכנתה בלפוסקו. צו מלכותי בליליפוט קבע שיש לשבור ביצים אך ורק מן הצד הצר, אך תושבי הממלכה השכנה, בלפוסקו, סירבו להישמע לצו והמשיכו לשבור את הביצים מן קצה הרחב (big-end), מה שנתן להם את הכינוי big-endians, והיה עילה למלחמה בין הממלכות. המונחים little-endian ו-endianesses מקורם באותו הסיפור.

נקודה צפה וסדר בתים[עריכת קוד מקור | עריכה]

מעבדי x86 (מעבדי אינטל) הנפוצים משתמשים בשיטת Little Endian עבור כל סוגי נתונים (מספרים שלמים, נקודה צפה ו-BCD), אך יש מחשבים בהם מספרים של נקודה צפה נשמרים בשיטת Big Endian, ומספרים שלמים מאוכסנים בשיטת Little Endian. אין למעשה הכרח להשתמש באותה שיטה לייצג שלמים ומספרי נקודה צפה. קיים מגוון רחב של פורמטים לייצוג מספרי נקודה צפה, וכדי להאחיד את המערכות נקבע תקן IEEE 754 המגדיר ייצוגי נקודה צפה, אך תקן זה לא מגדיר את סדר הבתים (Endianness) בו יאוכסנו מספרים אלו בזיכרון.

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

תקשורת טורית[עריכת קוד מקור | עריכה]

סוגיה דומה אך לא זהה קיימת בתקשורת טורית. בצורת תקשורת זו, הסיביות עצמן נשלחות על גבי הכבל אחת אחת, ולכן יש לענות על השאלה, כששולחים בית נתון, האם הסיבית הראשונה שנשלחת ("First Bit on the Wire") היא הסיבית המשמעותית ביותר או הפחות משמעותית של הבית. החלטה זו שייכת בדרך כלל לתקן החומרה הפיזי‏[1], ואינה משתנה גם כאשר אותו סוג תקשורת משמש מחשבים או פרוטוקולי תקשורת Big Endian או Little Endian.

הערות שוליים[עריכת קוד מקור | עריכה]

  1. ^ לדוגמה: בתקנים Ethernet ו-RS-232 הסיבית הפחות-משמעותית (LSB) נשלחת ראשונה, ולעומת זאת בתקנים Token ring ו- FDDI הסיבית המשמעותית יותר (MSB) נשלחת ראשונה