อ่าน 12 นาที
เอนเดียนเนส
ในทาง คอมพิวเตอร์ เอนเดียนเนส ( Endianness ) คือลำดับที่ ไบต์ ภายใน ชนิดข้อมูล เวิร์ด ( word data type ) ถูกส่งผ่าน สื่อ การสื่อสารข้อมูล หรือ ระบุตำแหน่ง ใน...
เอนเดียนเนส

ในทางคอมพิวเตอร์ เอนเดียนเนส ( Endianness ) คือลำดับที่ไบต์ภายในชนิดข้อมูล เวิร์ด ( word data type ) ถูกส่งผ่าน สื่อ การสื่อสารข้อมูลหรือระบุตำแหน่งในหน่วยความจำคอมพิวเตอร์โดยนับเฉพาะความสำคัญ ของไบต์ เมื่อเทียบกับความเร็ว (earliness) เอนเดียนเนสส่วนใหญ่แสดงเป็นแบบบิ๊กเอนเดียน (Big-Endian หรือ BE ) หรือ ลิตเติ้ลเอนเดียน ( Little-EndianหรือLE )
คอมพิวเตอร์จัดเก็บข้อมูลในกลุ่มบิตไบนารี ที่มีขนาดแตกต่างกัน แต่ละกลุ่มจะได้รับหมายเลขที่เรียกว่าที่อยู่ซึ่งคอมพิวเตอร์ใช้เพื่อเข้าถึงข้อมูลนั้น ในคอมพิวเตอร์สมัยใหม่ส่วนใหญ่ กลุ่มข้อมูลที่เล็กที่สุดที่มีที่อยู่จะมีขนาดแปดบิต และเรียกว่าไบต์กลุ่มที่ใหญ่กว่าจะประกอบด้วยสองไบต์ขึ้นไป ตัวอย่างเช่น คำหนึ่งคำมักประกอบด้วย32 บิตหรือ64บิต
มีสองวิธีหลักที่คอมพิวเตอร์สามารถกำหนดหมายเลขให้กับไบต์แต่ละตัวในกลุ่มที่ใหญ่กว่า โดยเริ่มจากปลายด้านใดด้านหนึ่ง ระบบบิ๊กเอนเดียนจะจัดเก็บไบต์ที่มีค่ามากที่สุดของคำไว้ที่ที่อยู่หน่วยความจำ ที่เล็กที่สุด และไบต์ที่มีค่าน้อยที่สุดไว้ที่ที่อยู่หน่วยความจำที่ใหญ่ที่สุด ในทางตรงกันข้าม ระบบลิตเติลเอนเดียนจะจัดเก็บไบต์ที่มีค่าน้อยที่สุดไว้ที่ที่อยู่หน่วยความจำที่เล็กที่สุด[ 1 ] [ 2 ] [ 3 ]ในบรรดาสองระบบนี้ ระบบบิ๊กเอนเดียนจึงใกล้เคียงกับวิธีการเขียนตัวเลขจากซ้ายไปขวาในภาษาอังกฤษ โดยให้ตัวเลขที่มีค่า มากที่สุด อยู่ก่อน เมื่อเปรียบเทียบตัวเลขกับไบต์และสมมติว่าที่อยู่เพิ่มขึ้นจากซ้ายไปขวา
ทั้งสองประเภทของลำดับไบต์ (endianness) มีการใช้งานอย่างแพร่หลายในวิศวกรรมอิเล็กทรอนิกส์ดิจิทัล การเลือกลำดับไบต์เริ่มต้นของการออกแบบใหม่มักเป็นไปโดยพลการ แต่การแก้ไขและการอัปเดตเทคโนโลยีในภายหลังจะคงลำดับไบต์ที่มีอยู่ไว้เพื่อรักษาความเข้ากันได้กับเวอร์ชันก่อนหน้า ลำดับไบต์แบบบิ๊กเอนเดียน (Big-endianness) เป็นลำดับไบต์ที่เด่นในโปรโตคอลเครือข่าย เช่น ในชุดโปรโตคอลอินเทอร์เน็ตซึ่งเรียกว่า ลำดับเครือข่าย ( network order ) โดยส่งไบต์ที่มีนัยสำคัญที่สุดก่อน ในทางกลับกัน ลำดับไบต์แบบลิตเติลเอนเดียน (Little-endianness) เป็นลำดับไบต์ที่เด่นสำหรับสถาปัตยกรรมโปรเซสเซอร์ ( x86 , การใช้งาน ARM ส่วนใหญ่ , การใช้งาน RISC-V พื้นฐาน ) และหน่วยความจำที่เกี่ยวข้องรูปแบบไฟล์สามารถใช้ลำดับไบต์ใดก็ได้ บางรูปแบบใช้ทั้งสองแบบผสมกัน หรือมีตัวบ่งชี้ว่าใช้ลำดับไบต์ใดตลอดทั้งไฟล์[ 4 ]
Bi-endiannessเป็นคุณลักษณะที่ได้รับการสนับสนุนจากสถาปัตยกรรมคอมพิวเตอร์จำนวนมาก ซึ่งมี endianness ที่สามารถสลับได้ในการดึงและจัดเก็บข้อมูล หรือสำหรับการดึงคำสั่ง ลำดับอื่นๆ โดยทั่วไปเรียกว่าmiddle-endianหรือmixed- endian [ 5 ] [ 6 ] [ 7 ] [ 8 ]
ต้นทาง

เอนเดียนเนสส่วนใหญ่แสดงออกเป็นบิ๊กเอนเดียน (BE) หรือลิตเติ้ลเอนเดียน (LE) ซึ่งเป็นคำที่แดนนี่ โคเฮน แนะนำ ในบันทึกการทดลองทางอินเทอร์เน็ตที่ตีพิมพ์ในปี 1980 [ 9 ]โคเฮนยืมคำเหล่านี้มาจากตอนที่ไร้สาระในนวนิยายเสียดสี เรื่อง กัลลิเวอร์ส ทราเวลส์โดยโจนาธาน สวิฟ ต์ ในดินแดน ลิลลิพุตในจินตนาการนักวิชาการแบ่งแยกกันอย่างรุนแรงด้วยการถกเถียงที่ไม่รู้จบเกี่ยวกับวิธีการที่ถูกต้องในการแตกเปลือกไข่ต้มผู้ที่ยืนยันที่จะแตกด้านใหญ่ของเปลือกไข่คือบิ๊กเอนเดียน ในขณะที่ฝ่ายตรงข้ามที่แตกด้านตรงข้ามของเปลือกไข่คือลิตเติ้ลเอนเดียน[ 10 ] [ 11 ]
ลักษณะเฉพาะ
หน่วยความจำคอมพิวเตอร์ประกอบด้วยลำดับของเซลล์จัดเก็บข้อมูล (หน่วยที่เล็กที่สุดที่สามารถระบุที่อยู่ได้ ) ในเครื่องที่รองรับการกำหนดที่อยู่แบบไบต์หน่วยเหล่านั้นเรียกว่าไบต์แต่ละไบต์จะถูกระบุและเข้าถึงในฮาร์ดแวร์และซอฟต์แวร์โดยใช้ที่อยู่หน่วยความจำหากจำนวนไบต์ทั้งหมดในหน่วยความจำคือnที่อยู่จะถูกกำหนดตั้งแต่ 0 ถึงn − 1
โปรแกรมคอมพิวเตอร์มักใช้โครงสร้างข้อมูลหรือฟิลด์ที่อาจประกอบด้วยข้อมูลมากกว่าที่สามารถจัดเก็บได้ในไบต์เดียว ในบริบทของบทความนี้ ซึ่งประเภทของฟิลด์ไม่สามารถซับซ้อนได้ตามอำเภอใจฟิลด์ประกอบด้วยลำดับของไบต์ที่ต่อเนื่องกันและแสดงถึงค่าข้อมูลอย่างง่ายซึ่งอย่างน้อยที่สุดอาจสามารถจัดการได้ด้วยคำสั่งฮาร์ดแวร์เพียงคำสั่งเดียวในระบบส่วนใหญ่ ที่อยู่ของค่าข้อมูลอย่างง่ายแบบหลายไบต์คือที่อยู่ของไบต์แรก (ไบต์ที่มีที่อยู่ต่ำที่สุด) มีข้อยกเว้นสำหรับกฎนี้ เช่น คำสั่ง Add ของIBM 1401จะกำหนดที่อยู่ของฟิลด์ที่มีความยาวแปรผันที่ตำแหน่งลำดับต่ำ (ที่อยู่สูงสุด) โดยความยาวจะถูกกำหนดโดยword markที่ตั้งไว้ที่ตำแหน่งลำดับสูง (ที่อยู่ต่ำที่สุด) เมื่อดำเนินการ เช่น การบวก โปรเซสเซอร์จะเริ่มต้นที่ตำแหน่งลำดับต่ำที่ที่อยู่สูงของฟิลด์ทั้งสองและดำเนินการลงไปจนถึงลำดับสูง[ 12 ]
คุณลักษณะสำคัญอีกประการหนึ่งของไบต์ที่เป็นส่วนหนึ่งของฟิลด์คือความสำคัญ ของมัน คุณลักษณะเหล่านี้ของส่วนต่างๆ ในฟิลด์มีบทบาทสำคัญในลำดับการเข้าถึงไบต์โดยฮาร์ดแวร์คอมพิวเตอร์ หรือกล่าวให้แม่นยำยิ่งขึ้นคือโดยอัลกอริธึมระดับต่ำที่ส่งผลต่อผลลัพธ์ของคำสั่งคอมพิวเตอร์
ตัวเลข
ระบบตัวเลขแบบตำแหน่ง (ส่วนใหญ่เป็นฐาน 2 หรือฐาน 10 บ้างเป็นบางครั้ง) เป็นวิธีหลักในการแสดงและโดยเฉพาะอย่างยิ่งการจัดการข้อมูลจำนวนเต็มโดยคอมพิวเตอร์ ในรูปแบบบริสุทธิ์ ระบบนี้ใช้ได้กับจำนวนเต็มที่ไม่เป็นลบขนาดปานกลาง เช่น ประเภทข้อมูล C unsignedในระบบตัวเลขดังกล่าวค่าของตัวเลขที่ประกอบเป็นจำนวนเต็มนั้น ไม่ได้ถูกกำหนดโดยค่าของตัวเลขนั้นเพียงอย่างเดียว แต่ยังถูกกำหนดโดยตำแหน่งที่ตัวเลขนั้นถือครองในจำนวนทั้งหมด ซึ่งเรียกว่าความสำคัญของตัวเลขนั้น ตำแหน่งเหล่านี้สามารถแมปไปยังหน่วยความจำได้หลักๆ สองวิธี: [ 13 ]
- การลดความสำคัญของตัวเลขเมื่อเพิ่มจำนวนที่อยู่หน่วยความจำ ซึ่งเรียกว่าbig-endianและ
- การเพิ่มค่าตัวเลขตามลำดับที่อยู่หน่วยความจำที่เพิ่มขึ้น เรียกว่า ระบบไบต์ เล็ก ( little-endian )
ในระบบจัดเก็บข้อมูลแบบ big-endianและlittle-endianนั้น " end"คือส่วนปลายสุดที่ ค่าความสำคัญ " big"หรือ"little"ถูกเขียนไว้ในตำแหน่งที่กำหนดโดยดัชนีของที่อยู่หน่วยความจำต่ำสุด
ข้อความ
เมื่อต้องการเปรียบเทียบสตริงข้อความต่างๆ เข้าด้วยกัน เช่น เพื่อสนับสนุนกลไกบางอย่าง เช่นการเรียงลำดับมักจะใช้วิธีการเปรียบเทียบตามลำดับตัวอักษรซึ่งแต่ละองค์ประกอบตำแหน่ง (ตัวอักษร) จะมีค่าตำแหน่งด้วย การเปรียบเทียบตามลำดับตัวอักษรหมายความว่า ตัวอักษรตัวแรกจะมีค่าสูงสุดเกือบทุกที่ เช่นเดียวกับในสมุดโทรศัพท์ เครื่องคอมพิวเตอร์เกือบทั้งหมดที่สามารถทำเช่นนี้ได้โดยใช้คำสั่งเดียวจะเป็นแบบ big-endian หรืออย่างน้อยก็เป็น mixed-endian
ตัวเลขจำนวนเต็มที่เขียนเป็นข้อความจะถูกจัดเก็บในหน่วยความจำโดยให้หลักที่มีค่ามากที่สุดอยู่ก่อนเสมอ ซึ่งคล้ายกับหลักการเรียงข้อมูลแบบบิ๊กเอนเดียน โดยไม่ขึ้นอยู่กับทิศทางการเขียนข้อความ
การกำหนดแอดเดรสแบบไบต์
เมื่อแสดงผลไบต์ของหน่วยความจำตามลำดับจากซ้ายไปขวา (เช่น ในการแสดงผลแบบเลขฐานสิบหก ) การแสดงจำนวนเต็มแบบ little-endian จะมีความสำคัญลดลงจากขวาไปซ้าย กล่าวอีกนัยหนึ่งคือ จะปรากฏกลับด้านเมื่อแสดงผล ซึ่งอาจขัดกับสัญชาตญาณ
พฤติกรรมนี้เกิดขึ้น ตัวอย่างเช่น ในFourCCหรือเทคนิคที่คล้ายกันซึ่งเกี่ยวข้องกับการบรรจุอักขระลงในจำนวนเต็ม เพื่อให้กลายเป็นลำดับของอักขระเฉพาะในหน่วยความจำ ตัวอย่างเช่น พิจารณาสตริง "JOHN" ซึ่งจัดเก็บในรูปแบบASCII เลขฐานสิบหก บนเครื่อง big-endian ค่าจะปรากฏจากซ้ายไปขวา ซึ่งตรงกับลำดับสตริงที่ถูกต้องสำหรับการอ่านผลลัพธ์ ("JOH N") แต่บนเครื่อง little-endian จะเห็นเป็น "NHO J" เครื่อง middle-endian ทำให้เรื่องนี้ซับซ้อนยิ่งขึ้นไปอีก ตัวอย่างเช่น บนPDP-11ค่า float 32 บิตจะถูกจัดเก็บเป็นคำ 16 บิตสองคำ "JO" "HN" ในรูปแบบ big-endian โดยอักขระในคำ 16 บิตจะถูกจัดเก็บในรูปแบบ little-endian ทำให้ได้ผลลัพธ์เป็น "OJN H" [ 14 ]
การสลับไบต์
การสลับไบต์ประกอบด้วยการจัดเรียงไบต์ใหม่เพื่อเปลี่ยนลำดับไบต์ (endianness) คอมไพเลอร์หลายตัวมีฟังก์ชันในตัวที่น่าจะถูกคอมไพล์เป็นคำสั่งประมวลผลแบบเนทีฟ ( bswap/ movbe) เช่น__builtin_bswap32อินเทอร์เฟซซอฟต์แวร์สำหรับการสลับไบต์ ได้แก่:
- ฟังก์ชัน endianness ของเครือข่ายมาตรฐาน(จาก/ไปยัง BE สูงสุด 32 บิต) [ 15 ] Windows มีส่วนขยาย 64 บิตใน
winsock2.h. - ฟังก์ชัน BSD และ Glibc
endian.h(จาก/ไปยัง BE และ LE สูงสุด 64 บิต) [ 16 ] - มาโคร macOS
OSByteOrder.h(จาก/ไปยัง BE และ LE สูงสุด 64 บิต) - ฟังก์ชัน
std::byteswapในC++ 23 [ 17 ]
ชุดคำสั่ง CPUบางชุดให้การสนับสนุนการสลับไบต์แบบ endian โดยธรรมชาติ เช่นbswap[ 18 ] ( x86 — 486และรุ่นต่อมา, i960 — i960Jx และรุ่นต่อมา[ 19 ] ) และrev[ 20 ] ( ARMv6และรุ่นต่อมา)
คอมไพเลอร์บางตัวมีฟังก์ชันในตัวสำหรับการสลับไบต์ ตัวอย่างเช่น คอมไพเลอร์ Intel Fortranรองรับตัวระบุที่ไม่เป็นมาตรฐานCONVERTเมื่อเปิดไฟล์ เช่น `<byte_swap> ` คอมไพเลอร์อื่นๆ มีตัวเลือกสำหรับการสร้างโค้ดที่เปิดใช้งานการแปลงนี้ทั่วทั้งระบบสำหรับการดำเนินการอ่านเขียนไฟล์ทั้งหมด ซึ่งช่วยให้สามารถนำโค้ดไปใช้ซ้ำบนระบบที่มีลำดับไบต์ตรงข้ามได้โดยไม่ต้องแก้ไขโค้ด OPEN(unit,CONVERT='BIG_ENDIAN',...)
ข้อควรพิจารณา
การเข้าถึงส่วนหนึ่งของฟิลด์ทำได้ง่ายขึ้น
ในระบบส่วนใหญ่ ที่อยู่ของค่าหลายไบต์คือที่อยู่ของไบต์แรก (ไบต์ที่มีที่อยู่ต่ำที่สุด) ระบบแบบ little-endian ประเภทนี้มีคุณสมบัติที่ว่า สำหรับค่าข้อมูลที่ต่ำเพียงพอ ค่าเดียวกันสามารถอ่านได้จากหน่วยความจำที่มีความยาวต่างกันโดยไม่ต้องใช้ที่อยู่ต่างกัน (แม้ว่าจะ มีการกำหนดข้อจำกัด การจัดเรียงก็ตาม) ตัวอย่างเช่น ตำแหน่งหน่วยความจำ 32 บิตที่มีเนื้อหา4A 00 00 00สามารถอ่านได้ที่ที่อยู่เดียวกันกับ8 บิต (ค่า = 4A), 16 บิต (004A), 24 บิต (00004A) หรือ32 บิต (0000004A) ซึ่งทั้งหมดจะคงค่าตัวเลขเดียวกันไว้ แม้ว่าคุณสมบัติ little-endian นี้จะไม่ค่อยถูกใช้โดยตรงโดยโปรแกรมเมอร์ระดับสูง แต่ก็มีการใช้โดยตัวเพิ่มประสิทธิภาพโค้ดและ โปรแกรมเมอร์ ภาษาแอสเซมบลี เป็นครั้งคราว แม้ว่า C++ จะไม่อนุญาตให้ใช้ แต่ โค้ด ประเภท punning ดังกล่าวได้ รับอนุญาตเป็น "กำหนดโดยการใช้งาน" โดยมาตรฐาน C11 [ 21 ]และใช้กันทั่วไป[ 22 ]ในโค้ดที่โต้ตอบกับฮาร์ดแวร์[ 23 ]
ลำดับการคำนวณ
การดำเนินการบางอย่างในระบบเลขตำแหน่งมีลำดับตามธรรมชาติหรือลำดับที่ต้องการในการดำเนินการขั้นตอนพื้นฐาน ลำดับนี้อาจส่งผลต่อประสิทธิภาพการทำงานบนโปรเซสเซอร์และไมโครคอนโทรลเลอร์ ขนาดเล็กที่สามารถระบุที่อยู่ไบต์ได้ อย่างไรก็ตาม โปรเซสเซอร์ประสิทธิภาพสูงมักจะดึงตัวดำเนินการหลายไบต์จากหน่วยความจำได้ในเวลาเท่ากับที่ดึงข้อมูลไบต์เดียว ดังนั้นความซับซ้อนของฮาร์ดแวร์จึงไม่ได้รับผลกระทบจากลำดับไบต์
การบวก การลบ และการคูณ เริ่มต้นที่ตำแหน่งหลักที่มีค่าน้อยที่สุด และส่งตัวทดไปยังตำแหน่งที่มีค่ามากกว่าถัดไป ในระบบส่วนใหญ่ ที่อยู่ของค่าหลายไบต์คือที่อยู่ของไบต์แรก (ไบต์ที่มีที่อยู่ต่ำที่สุด) การใช้งานการดำเนินการเหล่านี้จะง่ายขึ้นเล็กน้อยเมื่อใช้เครื่องที่มีรูปแบบไบต์เล็ก (little-endian) ซึ่งไบต์แรกนี้มีค่าหลักที่มีค่าน้อยที่สุด
การเปรียบเทียบและการหารจะเริ่มต้นที่หลักที่มีค่ามากที่สุด และส่งต่อตัวทดที่อาจเกิดขึ้นไปยังหลักที่มีค่าน้อยกว่าถัดไป สำหรับค่าตัวเลขที่มีความยาวคงที่ (โดยทั่วไปมีความยาว 1, 2, 4, 8, 16) การดำเนินการเหล่านี้จะง่ายกว่าเล็กน้อยบนเครื่องที่มีรูปแบบไบต์ใหญ่ (big-endian)
โปรเซสเซอร์แบบ big-endian บางตัว (เช่น IBM System/360 และรุ่นต่อๆ มา) มีคำสั่งฮาร์ดแวร์สำหรับเปรียบเทียบสตริงอักขระที่มีความยาวต่างกันตามลำดับตัวอักษร
โดยหลักการแล้ว การส่งข้อมูลตามปกติโดยใช้ คำสั่ง กำหนดค่าจะไม่ขึ้นอยู่กับลำดับไบต์ของโปรเซสเซอร์
ฮาร์ดแวร์
โปรเซสเซอร์ในอดีตและปัจจุบันจำนวนมากใช้การแสดงหน่วยความจำแบบบิ๊กเอนเดียน ไม่ว่าจะใช้แต่เพียงอย่างเดียวหรือเป็นตัวเลือกในการออกแบบIBM System/360ใช้ลำดับไบต์แบบบิ๊กเอนเดียน เช่นเดียวกับรุ่นต่อมาอย่างSystem/370 , ESA/390และz/Architecture PDP -10ใช้การกำหนดแอดเดรสแบบบิ๊กเอนเดียนสำหรับคำสั่งแบบไบต์ มินิคอมพิวเตอร์ IBM Series/1ใช้ลำดับไบต์แบบบิ๊กเอนเดียน โปรเซสเซอร์ตระกูล Motorola 6800/6801 , 6809และ68000ใช้รูปแบบบิ๊กเอนเดียน สถาปัตยกรรมที่ใช้บิ๊กเอนเดียนอย่างเดียว ได้แก่ IBM z/Architecture และOpenRISCอย่างไรก็ตาม มินิคอมพิวเตอร์ PDP-11 ใช้ลำดับไบต์แบบลิตเติ้ลเอนเดียน เช่นเดียวกับVAX รุ่นต่อมา
Datapoint 2200ใช้ตรรกะบิตอนุกรมแบบง่ายที่มี little-endian เพื่ออำนวยความสะดวกในการส่งต่อ carryเมื่อ Intel พัฒนา ไมโครโปรเซสเซอร์ 8008สำหรับ Datapoint พวกเขาใช้ little-endian เพื่อความเข้ากันได้ อย่างไรก็ตาม เนื่องจาก Intel ไม่สามารถส่งมอบ 8008 ได้ทันเวลา Datapoint จึงใช้ ตัวเทียบเท่า การรวมขนาดกลางแต่ยังคงรักษาความเป็น little-endian ไว้ในการออกแบบของ Intel ส่วนใหญ่ รวมถึงMCS-48และ8086และ ตัวสืบทอด x86รวมถึงโปรเซสเซอร์IA-32และx86-64 [ 24 ] [ 25 ]ตระกูลMOS Technology 6502 (รวมถึงWestern Design Center 65802และ65C816 ), Zilog Z80 (รวมถึงZ180และeZ80 ), Altera Nios II , Atmel AVR , Andes Technology NDS32, Qualcomm Hexagonและโปรเซสเซอร์และตระกูลโปรเซสเซอร์อื่นๆ อีกมากมายก็เป็น little-endian เช่นกัน
Intel 8051แตกต่างจากโปรเซสเซอร์ Intel อื่นๆ ตรงที่คาดหวังที่อยู่ 16 บิตสำหรับ LJMP และ LCALL ในรูปแบบ big-endian อย่างไรก็ตาม คำสั่ง xCALL จะเก็บที่อยู่ส่งคืนไว้ในสแต็กในรูปแบบ little-endian [ 26 ]
ไบเอนเดียนเนส
สถาปัตยกรรมชุดคำสั่งบางแบบมีฟังก์ชันที่อนุญาตให้สลับลำดับไบต์ (endianness) ในการดึงและจัดเก็บข้อมูล การดึงคำสั่ง หรือทั้งสองอย่าง สถาปัตยกรรมชุดคำสั่งเหล่านั้นเรียกว่า สถาปัตยกรรมแบบไบเอนเดียน (bi-endian ) สถาปัตยกรรมที่รองรับการสลับลำดับไบต์ ได้แก่PowerPC / Power ISA , SPARC V9, ARMเวอร์ชัน 3 ขึ้นไป, DEC Alpha , MIPS , Intel i860 , PA-RISC , SuperH SH-4 , IA-64 , C-SkyและRISC-Vคุณสมบัตินี้สามารถปรับปรุงประสิทธิภาพหรือลดความซับซ้อนของตรรกะของอุปกรณ์เครือข่ายและซอฟต์แวร์ คำว่าไบเอนเดียนเมื่อกล่าวถึงฮาร์ดแวร์ หมายถึงความสามารถของเครื่องในการคำนวณหรือส่งข้อมูลในรูปแบบลำดับไบต์ใดก็ได้
สถาปัตยกรรมเหล่านี้จำนวนมากสามารถเปลี่ยนไปใช้รูปแบบ endian เฉพาะตามค่าเริ่มต้นได้ผ่านซอฟต์แวร์ (โดยปกติจะทำเมื่อคอมพิวเตอร์เริ่มทำงาน) อย่างไรก็ตาม ในบางระบบ รูปแบบ endian เริ่มต้นจะถูกเลือกโดยฮาร์ดแวร์บนเมนบอร์ดและไม่สามารถเปลี่ยนแปลงได้ผ่านซอฟต์แวร์ (เช่น Alpha ซึ่งทำงานในโหมด big-endian เท่านั้นบนCray T3E )
IBM AIXและIBM iทำงานในโหมด big-endian บน Power ISA แบบ bi-endian; Linuxเดิมทีทำงานในโหมด big-endian แต่ในปี 2019 IBM ได้เปลี่ยนไปใช้โหมด little-endian สำหรับ Linux เพื่อให้การพอร์ตซอฟต์แวร์ Linux จาก x86 ไปยัง Power ทำได้ง่ายขึ้น[ 27 ] [ 28 ] SPARC ไม่มีการใช้งาน little-endian ที่เกี่ยวข้อง เนื่องจากทั้งOracle Solarisและ Linux ทำงานในโหมด big-endian บนระบบ SPARC แบบ bi-endian และสามารถถือได้ว่าเป็น big-endian ในทางปฏิบัติ ARM, C-Sky และ RISC-V ไม่มีการใช้งาน big-endian ที่เกี่ยวข้องและสามารถถือได้ว่าเป็น little-endian ในทางปฏิบัติ
คำว่าbi-endianนั้นหมายถึงวิธีการที่โปรเซสเซอร์จัดการกับการเข้าถึงข้อมูลเป็นหลัก การเข้าถึงคำสั่ง (การดึงคำสั่ง) บนโปรเซสเซอร์ที่กำหนดอาจยังคงถือว่ามี endianness คงที่ แม้ว่าการเข้าถึงข้อมูลจะเป็น bi-endianness อย่างสมบูรณ์ก็ตาม แต่ก็ไม่ใช่ทุกกรณี เช่น ใน ซีพียู Itanium ที่ใช้สถาปัตยกรรม IA-64 ของ Intel ซึ่งอนุญาตให้ใช้ได้ทั้งสองแบบ
ซีพียูบางตัวที่ระบุว่าเป็นแบบ bi-endian จำเป็นต้องอาศัยเมนบอร์ดช่วยในการสลับ endianness อย่างสมบูรณ์ ตัวอย่างเช่น โปรเซสเซอร์ PowerPC 32 บิตสำหรับเดสก์ท็ อป ในโหมด little-endian จะทำงานเหมือน little-endian จากมุมมองของโปรแกรมที่กำลังทำงานอยู่ แต่จำเป็นต้องใช้เมนบอร์ดในการสลับข้อมูล 64 บิตในทุกเลน 8 ไบต์ เพื่อให้แน่ใจว่ามุมมอง little-endian จะถูกนำไปใช้กับ อุปกรณ์ I/Oในกรณีที่ไม่มีฮาร์ดแวร์เมนบอร์ดพิเศษนี้ ซอฟต์แวร์ไดรเวอร์อุปกรณ์จะต้องเขียนไปยังที่อยู่ต่างกันเพื่อยกเลิกการแปลงที่ไม่สมบูรณ์ และยังต้องทำการสลับไบต์ตามปกติอีกด้วย
ซีพียูบางรุ่น เช่น โปรเซสเซอร์ PowerPC หลายรุ่นที่ออกแบบมาสำหรับใช้งานในระบบฝังตัว และโปรเซสเซอร์ SPARC เกือบทั้งหมด อนุญาตให้เลือกรูปแบบการเรียงลำดับไบต์ (endianness) ได้ในแต่ละหน้า
โปรเซสเซอร์ SPARC ตั้งแต่ช่วงปลายทศวรรษ 1990 (โปรเซสเซอร์ที่รองรับ SPARC v9) อนุญาตให้เลือก endianness ของข้อมูลได้สำหรับแต่ละคำสั่งที่โหลดหรือจัดเก็บข้อมูลลงในหน่วยความจำ
สถาปัตยกรรมARMรองรับโหมด big-endian สองโหมด เรียกว่าBE-8และBE-32 [ 29 ] CPUจนถึง ARMv5 รองรับเฉพาะ BE-32 หรือโหมด word-invariant เท่านั้น ในโหมดนี้ การเข้าถึงข้อมูล 32 บิตที่จัดเรียงตามธรรมชาติจะทำงานเหมือนในโหมด little-endian แต่การเข้าถึงไบต์หรือเวิร์ด 16 บิตจะถูกเปลี่ยนเส้นทางไปยังที่อยู่ที่เกี่ยวข้อง และไม่อนุญาตให้เข้าถึงข้อมูลที่ไม่จัดเรียง ARMv6 แนะนำ BE-8 หรือโหมด byte-invariant ซึ่งการเข้าถึงไบต์เดียวจะทำงานเหมือนในโหมด little-endian แต่การเข้าถึงเวิร์ด 16 บิต 32 บิต หรือ (เริ่มตั้งแต่ ARMv8) 64 บิต จะส่งผลให้มีการสลับไบต์ของข้อมูล ซึ่งช่วยลดความซับซ้อนของการเข้าถึงหน่วยความจำที่ไม่จัดเรียง รวมถึงการเข้าถึงรีจิสเตอร์ที่แมปหน่วยความจำที่ไม่ใช่ 32 บิตด้วย
โปรเซสเซอร์หลายตัวมีคำสั่งในการแปลงคำในรีจิสเตอร์ให้เป็นลำดับไบต์ตรงข้าม กล่าวคือ จะสลับลำดับของไบต์ในคำขนาด 16, 32 หรือ 64 บิต
CPU สถาปัตยกรรม Intel x86 และ x86-64 รุ่นล่าสุดมีคำสั่ง MOVBE ( Intel Coreตั้งแต่รุ่นที่ 4 หลังจากAtom ) [ 30 ]ซึ่งดึงคำในรูปแบบ big-endian จากหน่วยความจำหรือเขียนคำลงในหน่วยความจำในรูปแบบ big-endian โปรเซสเซอร์เหล่านี้เป็น little-endian อย่างสมบูรณ์
นอกจากนี้ยังมีอุปกรณ์ที่ใช้รูปแบบข้อมูลที่แตกต่างกันในส่วนต่างๆ ตัวอย่างเช่น เกจวัดระดับแบตเตอรี่ BQ27421 ของ Texas Instrumentsใช้รูปแบบ little-endian สำหรับรีจิสเตอร์ และใช้รูปแบบ big-endian สำหรับหน่วยความจำแบบเข้าถึงโดยสุ่ม (RAM )
สถาปัตยกรรม SPARCเคยใช้ระบบไบต์แบบ big-endian จนถึงเวอร์ชัน 9 ซึ่งเปลี่ยนเป็น bi-endian ในทำนองเดียวกัน โปรเซสเซอร์ IBM POWER รุ่นแรกๆ ก็ใช้ระบบไบต์แบบ big-endian แต่โปรเซสเซอร์PowerPCและPower ISAที่พัฒนาต่อยอดมานั้นใช้ระบบไบต์แบบ bi-endian แล้ว ส่วนสถาปัตยกรรม ARM นั้น เคยใช้ระบบไบต์แบบ little-endian ก่อนเวอร์ชัน 3 แล้วจึงเปลี่ยนมาใช้แบบ bi-endian
จุดลอยตัว
แม้ว่าโปรเซสเซอร์จำนวนมากจะใช้การจัดเก็บข้อมูลแบบ little-endian สำหรับข้อมูลทุกประเภท (จำนวนเต็ม, จุดลอยตัว) แต่ก็มีสถาปัตยกรรมฮาร์ดแวร์จำนวนหนึ่งที่ แสดงจำนวน จุดลอยตัวในรูปแบบ big-endian ในขณะที่จำนวนเต็มแสดงในรูปแบบ little-endian [ 31 ]มี โปรเซสเซอร์ ARMที่มีการแสดงจุดลอยตัวแบบ mixed-endian สำหรับจำนวนความแม่นยำสองเท่า: คำ 32 บิตสองคำแต่ละคำจะถูกจัดเก็บในรูปแบบ little-endian แต่คำที่มีนัยสำคัญที่สุดจะถูกจัดเก็บก่อน จุดลอยตัว ของ VAXจัดเก็บคำ 16 บิตแบบ little-endian ในลำดับ big-endian เนื่องจากมีรูปแบบจุดลอยตัวจำนวนมากที่ไม่มีมาตรฐานเครือข่ายสำหรับการแสดงรูปแบบเหล่านั้น มาตรฐาน XDRจึงใช้ IEEE 754 แบบ big-endian เป็นการแสดงรูปแบบ ดังนั้นจึงอาจดูแปลกที่ มาตรฐานจุดลอยตัว IEEE 754 ที่แพร่หลาย ไม่ได้ระบุ endianness [ 32 ]ในทางทฤษฎี นี่หมายความว่าแม้แต่ข้อมูลจุดลอยตัวมาตรฐาน IEEE ที่เขียนโดยเครื่องหนึ่งก็อาจอ่านไม่ได้โดยเครื่องอื่น อย่างไรก็ตาม ในคอมพิวเตอร์มาตรฐานสมัยใหม่ (เช่น คอมพิวเตอร์ที่ใช้มาตรฐาน IEEE 754) เราสามารถสันนิษฐานได้อย่างปลอดภัยว่าลำดับไบต์ของตัวเลขทศนิยมจะเหมือนกับตัวเลขจำนวนเต็ม ทำให้การแปลงข้อมูลทำได้ง่ายไม่ว่าจะเป็นชนิดข้อมูลใดก็ตาม แต่สำหรับ ระบบฝังตัว ขนาดเล็ก ที่ใช้รูปแบบตัวเลขทศนิยมแบบพิเศษ อาจเป็นอีกเรื่องหนึ่ง
ข้อมูลที่มีความยาวแปรผัน
คำสั่งส่วนใหญ่ที่กล่าวถึงไปแล้วนั้น จะมีขนาด (ความยาว) ของตัวถูกดำเนินการอยู่ภายในรหัสการทำงานความยาวของตัวถูกดำเนินการที่ใช้กันทั่วไปคือ 1, 2, 4, 8 หรือ 16 ไบต์ แต่ก็ยังมีสถาปัตยกรรมบางอย่างที่สามารถเก็บความยาวของตัวถูกดำเนินการไว้ในฟิลด์แยกต่างหากของคำสั่ง หรือเก็บไว้กับตัวถูกดำเนินการเอง เช่น โดยใช้เวิร์ดมาร์ควิธีการนี้ช่วยให้สามารถใช้ตัวถูกดำเนินการที่มีความยาวได้ถึง 256 ไบต์หรือมากกว่านั้น ชนิดข้อมูลของตัวถูกดำเนินการดังกล่าวจะเป็นสตริงอักขระหรือBCDเครื่องจักรที่สามารถจัดการข้อมูลดังกล่าวด้วยคำสั่งเดียว (เช่น เปรียบเทียบ บวก) ได้แก่IBM 1401 , 1410 , 1620 , System/360 , System/370 , ESA/390และz/Architectureซึ่งทั้งหมดเป็นเครื่องจักรแบบบิ๊กเอนด์
เอนเดียนกลาง
นอกจากนี้ ยังมี ลำดับการเรียงตัวอื่นๆ อีกมากมาย ซึ่งโดยทั่วไปเรียกว่าลำดับแบบมิดเดิลเอนเดียนหรือลำดับแบบมิกซ์เอนเดียน
PDP -11เป็นระบบ little-endian 16 บิตเป็นหลัก คำสั่งในการแปลงระหว่างค่าจุดลอยตัวและค่าจำนวนเต็มในโปรเซสเซอร์จุดลอยตัวเสริมของ PDP-11/45, PDP-11/70 และในโปรเซสเซอร์รุ่นต่อมาบางรุ่น จะเก็บ ค่า จำนวนเต็มแบบ double precision ขนาด 32 บิต โดยสลับครึ่ง 16 บิตจากลำดับ little-endian ที่คาดไว้ คอมไพเลอร์ C ของ UNIX ใช้รูปแบบเดียวกันสำหรับจำนวนเต็มแบบ long ขนาด 32 บิต ลำดับนี้เรียกว่าPDP- endian [ 33 ]
UNIX เป็นหนึ่งในระบบแรกๆ ที่อนุญาตให้คอมไพล์โค้ดเดียวกันสำหรับแพลตฟอร์มที่มีการแสดงผลภายในที่แตกต่างกัน หนึ่งในโปรแกรมแรกๆ ที่แปลงแล้วควรจะพิมพ์ออกมาUnixแต่บน Series/1 กลับพิมพ์ออกมาnUxiแทน[ 34 ]
วิธีหนึ่งในการตีความลำดับไบต์นี้คือ มันจัดเก็บจำนวนเต็ม 32 บิตเป็นคำ 16 บิตสองคำแบบ little-endian โดยมีลำดับคำแบบ big-endian:
| ออฟเซ็ตไบต์ | ค่า 8 บิต | ค่าลิตเติลเอนเดียน 16 บิต |
|---|---|---|
| 0 | 0Bh | 0A0Bh |
| 1 | 0Ah | |
| 2 | 0Dh | 0C0Dh |
| 3 | 0Ch |
ตัวอธิบายเซ็กเมนต์ของ โปรเซสเซอร์ IA-32และโปรเซสเซอร์ที่เข้ากันได้จะเก็บที่อยู่ฐาน 32 บิตของเซ็กเมนต์ที่จัดเก็บในลำดับ little-endian แต่ในสี่ไบต์ที่ไม่ต่อเนื่องกัน ณ ตำแหน่งสัมพัทธ์ 2, 3, 4 และ 7 ของจุดเริ่มต้นของตัวอธิบาย[ 35 ]
ซอฟต์แวร์
การออกแบบเชิงตรรกะ
ภาษาอธิบายฮาร์ดแวร์ (HDL) ที่ใช้ในการแสดงตรรกะดิจิทัลมักรองรับลำดับไบต์แบบใดก็ได้ โดยมีความละเอียดแบบใดก็ได้ ตัวอย่างเช่น ในSystemVerilogคำหนึ่งคำสามารถกำหนดให้เป็นแบบ little-endian หรือ big-endian ได้
ไฟล์และระบบไฟล์
การเข้าใจเรื่องลำดับไบต์ (endianness) มีความสำคัญเมื่ออ่านไฟล์หรือระบบไฟล์ที่สร้างขึ้นบนคอมพิวเตอร์ที่มีลำดับไบต์แตกต่างกัน
ไฟล์ Fortran แบบเรียงลำดับที่ไม่มีการจัดรูปแบบซึ่งสร้างขึ้นด้วย endianness หนึ่งแบบ มักจะไม่สามารถอ่านได้บนระบบที่ใช้ endianness อีกแบบหนึ่ง เนื่องจาก Fortran โดยทั่วไปจะจัดเก็บเรคอร์ด (ซึ่งนิยามว่าเป็นข้อมูลที่เขียนโดยคำสั่ง Fortran เพียงคำสั่งเดียว) เป็นข้อมูลที่มีฟิลด์นับจำนวนนำหน้าและตามหลัง ซึ่งเป็นจำนวนเต็มที่เท่ากับจำนวนไบต์ในข้อมูล การพยายามอ่านไฟล์ดังกล่าวโดยใช้ Fortran บนระบบที่มี endianness อีกแบบหนึ่งจะทำให้เกิดข้อผิดพลาดขณะรันไทม์ เนื่องจากฟิลด์นับจำนวนไม่ถูกต้อง
ข้อความ Unicodeสามารถเริ่มต้นด้วยเครื่องหมายลำดับไบต์ (BOM) เพื่อระบุลำดับไบต์ของไฟล์หรือสตรีมได้ โดยมีรหัสจุดเป็น U+FEFF ตัวอย่างเช่น ใน UTF-3200 00 FE FF ไฟล์แบบ big-endian ควรเริ่มต้นด้วย ; ส่วนไฟล์แบบ little-endian ควรเริ่มต้นด้วยFF FE 00 00.
รูปแบบข้อมูลไบนารีของแอปพลิเคชัน เช่น ไฟล์ .mat ของ MATLAB หรือ รูปแบบข้อมูล .bilที่ใช้ในภูมิประเทศ มักจะไม่ขึ้นกับลำดับไบต์ ซึ่งทำได้โดยการจัดเก็บข้อมูลในรูปแบบลำดับไบต์คงที่เสมอ หรือโดยการใส่สวิตช์เพื่อระบุลำดับไบต์ ตัวอย่างของกรณีแรกคือ รูปแบบ ไฟล์ไบนารี XLSที่สามารถใช้งานได้ระหว่างระบบ Windows และ Mac และเป็นแบบ little-endian เสมอ ซึ่งต้องใช้แอปพลิเคชัน Mac ในการสลับไบต์เมื่อโหลดและบันทึกเมื่อทำงานบนโปรเซสเซอร์ Motorola 68K หรือ PowerPC แบบ big-endian [ 36 ]
ไฟล์ภาพ TIFFเป็นตัวอย่างของกลยุทธ์ที่สอง ซึ่งส่วนหัวของไฟล์จะแจ้งให้แอปพลิเคชันทราบเกี่ยวกับลำดับไบต์ของจำนวนเต็มไบนารีภายใน หากไฟล์เริ่มต้นด้วยลายเซ็น ` MM--big-endian` หมายความว่าจำนวนเต็มถูกแสดงเป็นแบบ big-endian ในขณะที่ ` II--little-endian` หมายความว่าเป็นแบบ little-endian ลายเซ็นเหล่านี้ต้องการคำขนาด 16 บิตเพียงคำเดียว และเป็นพาลินโดรมดังนั้นจึงไม่ขึ้นอยู่กับลำดับไบต์ `--integral` IหมายถึงIntelและ `--molecular` MหมายถึงMotorolaซีพียู Intel เป็นแบบ little-endian ในขณะที่ซีพียู Motorola 680x0 เป็นแบบ big-endian ลายเซ็นที่ระบุอย่างชัดเจนนี้ช่วยให้โปรแกรมอ่าน TIFF สามารถสลับไบต์ได้หากจำเป็น เมื่อไฟล์ที่กำหนดถูกสร้างขึ้นโดยโปรแกรมเขียน TIFF ที่ทำงานบนคอมพิวเตอร์ที่มีลำดับไบต์ต่างกัน
เนื่องจากการใช้งานดั้งเดิมบนแพลตฟอร์ม Intel 8080 ระบบไฟล์ File Allocation Table (FAT) ที่ไม่ขึ้นกับระบบปฏิบัติการจึงถูกกำหนดด้วยการเรียงลำดับไบต์แบบ little-endian แม้แต่บนแพลตฟอร์มที่ใช้ endianness อื่นเป็นหลัก ซึ่งจำเป็นต้องมีการดำเนินการสลับไบต์เพื่อรักษารูปแบบ FAT บนแพลตฟอร์มเหล่านั้น
ZFSซึ่งรวมระบบไฟล์และตัวจัดการวอลุ่มเชิงตรรกะ เข้าด้วย กัน เป็นที่ทราบกันดีว่าให้ endianness แบบปรับได้และใช้งานได้กับทั้งระบบ big-endian และ little-endian [ 37 ]
การสร้างเครือข่าย
RFC ของ IETFหลายฉบับใช้คำว่าลำดับเครือข่ายซึ่งหมายถึงลำดับการส่งไบต์ผ่านสายในโปรโตคอลเครือข่ายในบรรดาเอกสารอื่นๆRFC 1700 ในอดีต ได้กำหนดลำดับเครือข่ายสำหรับโปรโตคอลในชุดโปรโตคอลอินเทอร์เน็ตให้เป็นแบบ big-endian [ 38 ]
อย่างไรก็ตาม โปรโตคอลทั้งหมดไม่ได้ใช้ลำดับไบต์แบบ big-endian เป็นลำดับเครือข่าย โปรโตคอล Server Message Block (SMB) ใช้ลำดับไบต์แบบ little-endian ในCANopenพารามิเตอร์หลายไบต์จะถูกส่งโดยไบต์ที่มีค่าน้อยที่สุดก่อนเสมอ (little-endian) เช่นเดียวกับEthernet Powerlink [ 39 ]
API ซ็อกเก็ต Berkeley กำหนดชุดฟังก์ชันเพื่อแปลงจำนวนเต็ม 16 บิตและ 32 บิตไปและกลับจากลำดับไบต์เครือข่าย: ฟังก์ชัน (host-to-network-short) และ(host-to-network-long) แปลงค่า 16 บิตและ 32 บิตตามลำดับจากลำดับเครื่อง ( host ) ไปเป็นลำดับเครือข่าย ฟังก์ชัน และแปลงจากลำดับเครือข่ายไปเป็นลำดับโฮสต์[ 40 ] [ 41 ]ฟังก์ชันเหล่านี้อาจไม่มีการดำเนินการใดๆบนระบบ big-endian htonshtonlntohsntohl
ในขณะที่โปรโตคอลเครือข่ายระดับสูงมักจะพิจารณาไบต์ (ส่วนใหญ่หมายถึงอ็อกเท็ต ) เป็นหน่วยพื้นฐาน แต่เลเยอร์ล่างสุดของสแต็กเครือข่ายอาจจัดการกับการเรียงลำดับของบิตภายในไบต์ การเรียงลำดับของบิตบางครั้งเรียกว่า little-endian หรือ big-endian การเรียงลำดับของบิตไม่จำเป็นต้องเหมือนกับการเรียงลำดับของไบต์ ตัวอย่างเช่นRS-232ส่งบิตที่มีค่าต่ำสุดก่อนI2Cส่งบิตที่มีค่าสูงสุดก่อน และSPIสามารถส่งได้ทั้งสองลำดับอีเธอร์เน็ตส่งบิตแต่ละบิตโดยให้ค่าต่ำสุดก่อน แต่ไบต์จะถูกส่งแบบ big-endian
ดูเพิ่มเติม
- ลำดับบิต – ข้อกำหนดในการระบุตำแหน่งบิต
ลิงก์ภายนอก
สรุปเนื้อหา
ข้อมูลสำคัญจากบทความ
ข้อมูลสำคัญเกี่ยวกับ เอนเดียนเนส
ในทาง คอมพิวเตอร์ เอนเดียนเนส ( Endianness ) คือลำดับที่ ไบต์ ภายใน ชนิดข้อมูล เวิร์ด ( word data type ) ถูกส่งผ่าน สื่อ การสื่อสารข้อมูล หรือ ระบุตำแหน่ง ใน...
ต้นทาง
เอนเดียนเนสส่วนใหญ่แสดงออกเป็น บิ๊กเอนเดียน (BE) หรือ ลิตเติ้ลเอนเดียน (LE) ซึ่งเป็นคำที่แดน นี่ โคเฮน แนะนำ ใน บันทึกการทดลองทางอินเทอร์เน็ต ที่ตีพิมพ์ในปี 1980 [ 9 ] โคเฮนยืมคำเหล่านี้มาจากตอนที่ไร้สาระในนวนิยายเสียดสี เรื่อง กัลลิเวอร์ส ทราเวลส์ โดย...
ลักษณะเฉพาะ
หน่วยความจำคอมพิวเตอร์ ประกอบด้วยลำดับของเซลล์จัดเก็บข้อมูล (หน่วยที่เล็กที่สุด ที่สามารถระบุที่อยู่ได้ ) ในเครื่องที่รองรับ การกำหนดที่อยู่แบบไบต์ หน่วยเหล่านั้นเรียกว่า ไบต์ แต่ละไบต์จะถูกระบุและเข้าถึงในฮาร์ดแวร์และซอฟต์แวร์โดยใช้ที่อยู่ หน่วยความจำ...
ตัวเลข
ระบบตัวเลขแบบตำแหน่ง (ส่วนใหญ่เป็นฐาน 2 หรือฐาน 10 บ้างเป็นบางครั้ง) เป็นวิธีหลักในการแสดงและโดยเฉพาะอย่างยิ่งการจัดการ ข้อมูลจำนวนเต็ม โดยคอมพิวเตอร์ ในรูปแบบบริสุทธิ์ ระบบนี้ใช้ได้กับจำนวนเต็มที่ไม่เป็นลบขนาดปานกลาง เช่น ประเภทข้อมูล C unsigned...