סדר בתים

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

רקע

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

הגדרת סדר הבתים

כאמור, במוסכמה המקובלת למעשה בכל המחשבים בימינו, לכל בית בזיכרון המחשב יש כתובת משלו. כאשר שומרים מספר שלם המיוצג על ידי מספר בתים בזיכרון המחשב, הבתים המייצגים את המספר נשמרים ברצף, כלומר בכתובות סמוכות. כאן צצות שתי אפשרויות: אפשר לייצג את המספר כך שהבית המשמעותי ביותר מאוחסן בכתובת הנמוכה (או קטנה) ביותר, ואפשר לאחסן את המספר כך שהבית המשמעותי ביותר מאוחסן בכתובת הגבוהה (או הגדולה) ביותר. האפשרות הראשונה נקראת "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.
האיור להלן מדגים איך ישמר המספר 168,496,141 או בבסיס 16 0x0A0B0C0D בייצוג של 32 סיביות (ארבעה בתים) במחשבים המשתמשים בשתי השיטות. 
(שימו לב ש"הכתובת הקטנה" מופיעה בחלק העליון של האיור)
ישנם מעבדים המסוגלים לפנות לזיכרון בשתי השיטות (בדרך כלל השיטה שבשימוש בכל רגע נתון נשלטת על ידי אחת הסיביות ב"אוגר הדגלים"). דוגמאות למעבדים כאלו הם Alpha של DEC, ‏PowerPC של IBM, ‏SPARC V9 של סאן מיקרוסיסטמס, ARM ועוד.
פרוטוקולי תקשורת רבים יכולים להחשב בשיטת סדר בתים גדול, במובן שהחלק המשמעותי ביותר נשלח ראשון.
כך לדוגמה במערכת הטלפוניה הקלאסית, אנו מחייגים ראשית את מספר הקידומת, ולאחר מכן את שאר מספר היעד.
גם בתקשורת מחשבים מסוג IP עובדים בשיטת סדר בתים גדול. לעיתים, סדר כזה אינו הסדר שבו המחשב פועל. זו הסיבה שבתוכנות רבות משתמשים בפונקציות מיוחדות לפני השידור, ואחרי הקליטה. למשל ()htoa: ‏hardware to network. ו ()ntoh: ‏network to hardware.

אטימולוגיה

מקור המונחים Little-Endian ו-Big-Endian באנגלית הוא הרומן הסאטירי משנת 1726, מסעי גוליבר של ג'ונתן סוויפט, והוכנס לשימוש במשמעות של סדר בתים על ידי דני כהן בשנת 1980.
ברומן של סוויפט מתארת מלחמה בין ממלכת ליליפוט לשכנתה בלפוסקו. שתי הממלכות מאמינות באותם כתבי קודש, שמציינים במפורש ש"יש לשבור את הביצה מן הצד הנכון", אך לא מפרטים איזה צד הוא ה"נכון". צו מלכותי בליליפוט קבע שיש לשבור ביצים אך ורק מן הצד הצר, אך תושבי הממלכה השכנה, בלפוסקו, סירבו להישמע לצו והמשיכו לשבור את הביצים מן קצה הרחב (big-end), מה שנתן להם את הכינוי big-endians, והיה עילה למלחמה בין הממלכות. במאמר שפרסם כהן באחד באפריל 1980, הוא השווה את ה"מלחמה" על סדר הבתים למלחמה בין ליליפוט ובלפוסקו, וטבע את השימוש במונחים little-endian ו-endianesses לסדר בתים.

נקודה צפה וסדר בתים

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

תקשורת טורית

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