סדר בתים

במחשוב, המונח סדר בתים (באנגלית: Byte Order, או Endianness) מציין את האופן בו נשמרים ערכים של מספרים שלמים בזיכרון מחשב. בתחילת ימי המחשוב המהנדסים שתכננו כל מחשב חדש קבעו לעצמם את אופני השימוש בזיכרון, אך תוך זמן לא רב נתקבעה המוסכמה שנמצאת כיום בשימוש בכל המחשבים (למעט אולי יוצאי דופן נדירים ביותר). מוסכמה זו היא כדלקמן: זיכרון המחשב מאורגן בבתים, כשכל בית מורכב מ-8 סיביות. המעבד ניגש לזיכרון לצורך קריאה או כתיבה בעזרת שימוש במצביעים. כל מצביע כזה נקרא גם "כתובת", ולכל בית בזיכרון המחשב יש כתובת משלו. אפשר להסתכל על כתובות אלו כמספרים שלמים בעצמן, ושני בתים נקראים "סמוכים" אם כתובותיהם נבדלות ב-1. המונח "סדר הבתים" מתייחס לאופן בו מאוחסנים בזיכרון המחשב מספרים שלמים שמיוצגים על ידי מספר בתים. מספרים מיוצגים בזיכרון המחשב בצורה בינארית, כלומר על ידי רצפים של סיביות. מאז נתקבעה המוסכמה, כמעט כל המספרים בכל המחשבים מיוצגים על ידי מספר שלם של בתים, או במילים אחרות, מספר הסיביות שלהם הוא כפולה של 8. הגדלים הנפוצים ביותר הם מספרים המיוצגים על ידי בית יחיד, שני בתים, ארבעה או שמונה. כאשר מספר שלם מיוצג על ידי מספר בתים (כלומר יותר מבית אחד), אחד הבתים הוא הבית "המשמעותי ביותר", ואחד הבתים "הפחות משמעותי". הגדרות אלו שקולות לייצוג הספרות במספר עשרוני. למשל במספר ארבע ספרתי נאמר שספרת האלפים היא "המשמעותית ביותר", וספרת האחדות היא ה"פחות משמעותית". נפוצים בעיקר שני סוגים של "שלמים" במחשב: שלמים "ללא סימן" (unsigned), ושלמים עם סימן (signed). עבור שלמים עם סימן, שיטת הייצוג המקובלת נקראת משלים ל-2. שלם המיוצג בבית יחיד ללא סימן יכול לייצג ערכים בין 0 ל-255, בעוד שבשיטת משלים ל-2, בית יחיד יכול לייצג ערכים בין 128- לבין 127. הטבלה הבאה מציגה את גודלי השלמים הניתנים לייצוג, כתלות במספר הבתים: קיימות שיטות נוספות לייצג שלמים במחשב, אך האמור בערך הזה מתייחס לשתי השיטות המקובלות - ללא סימן או משלים ל-2. מקור המונחים Little-Endian ו-Big-Endian באנגלית הוא הרומן הסאטירי משנת 1726, מסעי גוליבר של ג'ונתן סוויפט, והוכנס לשימוש במשמעות של סדר בתים על ידי דני כהן בשנת 1980. ברומן של סוויפט מתוארת מלחמה בין ממלכת ליליפוט לשכנתה בלפוסקו. שתי הממלכות מאמינות באותם כתבי קודש, שמציינים במפורש ש"יש לשבור את הביצה מן הצד הנכון", אך לא מפרטים איזה צד הוא ה"נכון". צו מלכותי בליליפוט קבע שיש לשבור ביצים אך ורק מן הצד הצר, אך תושבי הממלכה השכנה, בלפוסקו, סירבו להישמע לצו והמשיכו לשבור את הביצים מן קצה הרחב (big-end), מה שנתן להם את הכינוי big-endians, והיה עילה למלחמה בין הממלכות. במאמר שפרסם כהן באחד באפריל 1980, הוא השווה את ה"מלחמה" על סדר הבתים למלחמה בין ליליפוט ובלפוסקו, וטבע את השימוש במונחים little-endian ו-endianesses לסדר בתים. כאמור, במוסכמה המקובלת למעשה בכל המחשבים בימינו, לכל בית בזיכרון המחשב יש כתובת משלו. כאשר שומרים מספר שלם המיוצג על ידי מספר בתים בזיכרון המחשב, הבתים המייצגים את המספר נשמרים ברצף, כלומר בכתובות סמוכות. כאן צצות שתי אפשרויות: אפשר לייצג את המספר כך שהבית המשמעותי ביותר מאוחסן בכתובת הנמוכה (או קטנה) ביותר, ואפשר לאחסן את המספר כך שהבית המשמעותי ביותר מאוחסן בכתובת הגבוהה (או הגדולה) ביותר. האפשרות הראשונה נקראת "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 סיביות (ארבעה בתים) במחשבים המשתמשים בשתי השיטות. סדר בתים קטן: בכתובת הקטנה ביותר יישמר 0x0D סדר בתים גדול: בכתובת הקטנה ביותר יישמר 0x0A (שימו לב ש"הכתובת הקטנה" מופיעה בחלק העליון של האיור) ישנם מעבדים המסוגלים לפנות לזיכרון בשתי השיטות (בדרך כלל השיטה שבשימוש בכל רגע נתון נשלטת על ידי אחת הסיביות ב"אוגר הדגלים"). דוגמאות למעבדים כאלו הם Alpha של DEC, ‏PowerPC של IBM, ‏SPARC V9 של סאן מיקרוסיסטמס, ARM ועוד. פרוטוקולי תקשורת רבים יכולים להחשב בשיטת סדר בתים גדול, במובן שהחלק המשמעותי ביותר נשלח ראשון. כך לדוגמה במערכת הטלפוניה הקלאסית, אנו מחייגים ראשית את מספר הקידומת, ולאחר מכן את שאר מספר היעד. גם בתקשורת מחשבים מסוג IP עובדים בשיטת סדר בתים גדול. לעיתים, סדר כזה אינו הסדר שבו המחשב פועל. זו הסיבה שבתוכנות רבות משתמשים בפונקציות מיוחדות לפני השידור, ואחרי הקליטה. למשל ()htoa: ‏hardware to network. ו ()ntoh: ‏network to hardware. מעבדי x86 (מעבדי אינטל) הנפוצים משתמשים בשיטת Little Endian עבור כל סוגי נתונים (מספרים שלמים, נקודה צפה ו-BCD), אך יש מחשבים בהם מספרים של נקודה צפה נשמרים בשיטת Big Endian, ומספרים שלמים מאוכסנים בשיטת Little Endian. אין למעשה הכרח להשתמש באותה שיטה לייצג שלמים ומספרי נקודה צפה. קיים מגוון רחב של פורמטים לייצוג מספרי נקודה צפה, וכדי להאחיד את המערכות נקבע תקן IEEE 754 (אנ'), המגדיר ייצוגי נקודה צפה, אך אינו מגדיר את סדר הבתים (Endianness) בו יאוחסנו מספרים אלו בזיכרון. עם זאת, במחשבים מודרניים סטנדרטיים (המיישמים את תקן IEEE 754), אפשר בפועל להניח כי סדר הבתים זהה עבור מספרי נקודה צפה כמו עבור מספרים שלמים. סוגיה דומה אך לא זהה קיימת בתקשורת טורית. בצורת תקשורת זו, הסיביות עצמן נשלחות על גבי הכבל אחת אחת, ולכן יש לענות על השאלה, כששולחים בית נתון, האם הסיבית הראשונה שנשלחת ("First Bit on the Wire") היא הסיבית המשמעותית ביותר או הפחות משמעותית של הבית. החלטה זו שייכת בדרך כלל לתקן החומרה הפיזי, ואינה משתנה גם כאשר אותו סוג תקשורת משמש מחשבים או פרוטוקולי תקשורת Big Endian או Little Endian. מדיה וקבצים בנושא סדר בתים בוויקישיתוף דני כהן, ON HOLY WARS AND A PLEA FOR PEACE, ietf.org, ‏1 באפריל, 1980 לדוגמה: בתקנים Ethernet ו-RS-232 הסיבית הפחות-משמעותית (LSB) נשלחת ראשונה, ולעומת זאת בתקנים Token ring ו- FDDI הסיבית המשמעותית יותר (MSB) נשלחת ראשונה