ngay cả khi bạn nghĩ rằng bạn không cần phải biết sự kết thúc mà ai đó có thể làm. Không cần phải giải thích tại sao ai đó không cần nó bởi vì bạn có thể không biết bối cảnh. Câu hỏi không phải là "tôi cần biết về endianness" mà là "nó có phải là lớn hay nhỏ không". Vì vậy, tập trung vào chủ đề xin vui lòng!
Phải nói rằng có lẽ đó là cách tốt nhất nếu chúng ta không phát minh lại bánh xe và chỉ dựa vào các macro mà Apple cung cấp cho việc này. Lý do là vì họ đã dành khá nhiều thời gian để tối ưu hóa các macro này và đảm bảo rằng nó hoạt động tốt với trình giả lập cũng như trên Mac, iPhone và tất cả hệ điều hành và phần cứng của họ.
Nếu bạn tìm hiểu những gì đang xảy ra khi bạn gọi, CFSwapInt16BigToHost
bạn có thể thấy các bình luận cho thấy các macro này đang tạo ra mã máy tốt nhất bạn có thể nhận được với sự trợ giúp của tối ưu hóa trình biên dịch:
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;
}