แม้ว่าคุณคิดว่าคุณไม่จำเป็นต้องรู้ว่าใครบางคนอาจทำ endianness ไม่จำเป็นต้องอธิบายว่าทำไมบางคนถึงไม่ต้องการเพราะคุณอาจไม่รู้บริบท คำถามไม่ได้ "ฉันต้องรู้ endianness" แต่ค่อนข้าง "เป็น endian น้อยหรือใหญ่" ดังนั้นจงมุ่งความสนใจไปที่หัวเรื่อง!
ต้องบอกว่าอาจเป็นวิธีที่ดีที่สุดถ้าเราไม่คิดค้นล้อใหม่และพึ่งมาโครที่ Apple เตรียมไว้ให้ เหตุผลก็เพราะพวกเขาใช้เวลาพอสมควรในการปรับแต่งมาโครเหล่านี้และทำให้แน่ใจว่าทำงานได้ดีกับตัวจำลองรวมทั้งบน Mac, iPhone และระบบปฏิบัติการและฮาร์ดแวร์ทั้งหมด
หากคุณขุดสิ่งที่เกิดขึ้นเมื่อคุณเรียกใช้CFSwapInt16BigToHost
คุณอาจเห็นความคิดเห็นที่แนะนำมาโครเหล่านี้อาจสร้างรหัสเครื่องที่ดีที่สุดที่คุณจะได้รับด้วยความช่วยเหลือของการปรับแต่งคอมไพเลอร์:
OS_INLINE
uint16_t
_OSSwapInt16(
uint16_t data
)
{
/* Reduces to 'rev16' with clang */
return (uint16_t)(data << 8 | data >> 8);
}
OS_INLINE
uint32_t
_OSSwapInt32(
uint32_t data
)
{
#if defined(__llvm__)
data = __builtin_bswap32(data);
#else
/* This actually generates the best code */
data = (((data ^ (data >> 16 | (data << 16))) & 0xFF00FFFF) >> 8) ^ (data >> 8 | data << 24);
#endif
return data;
}