Big endian và Little endian
computer science
2
White

huydx viết ngày 19/12/2016

Hôm nay có đọc một bài báo trên vnexpress, tiêu đề khá câu khách :
http://vnexpress.net/tin-tuc/giao-duc/nhung-cau-hoi-phong-van-tuyen-dung-ky-quac-cua-apple-3515701.html

Cá nhân tôi thấy những câu hỏi trong đó có nhiều câu kì quặc và không có tính thực tế, tuy nhiên trong đó có một câu khá thú vị:

  1. Viết một đoạn mã cho phép phát hiện máy bạn đang chạy chương trình với little Endian hay big Endian. (Hai thuật ngữ này chỉ sự khác nhau về cách đọc và ghi dữ liệu giữa các nền tảng máy tính).

Do tôi không biết cách làm câu này nên đã google. Sau khi google thì ra được đoạn code sau:

int x=1; // 0x00000001
if (*(char*)&x) {
        /* little endian. memory image 01 00 00 00 */
}else{
        /* big endian. memory image 00 00 00 01 */
}

Lâu không đụng đến C nên không nhớ behavior khi cast pointer ra sao, nên google tiếp thì tìm một câu trả lời rất dễ hiểu trên stackoverflow.

http://stackoverflow.com/a/12792301/983800

Đại ý của câu trả lời đó là, giả sử chúng ta có 1 biến x với giá trị là int 1.
Với little endian thì memory layout của x sẽ như sau:

       higher memory
          ----->
    +----+----+----+----+
    |0x01|0x00|0x00|0x00|
    +----+----+----+----+
    A
    |
   &x

Còn với big endian thì memory layout của x sẽ là:

   +----+----+----+----+
    |0x00|0x00|0x00|0x01|
    +----+----+----+----+
    A
    |
   &x

Do đó để biết architect hiện tại thuộc loại nào thì chỉ cần xem byte đầu tiên của x có giá trị là bao nhiêu là được. Do x là int (4 bytes) nên để lấy ra byte đầu tiên thì chúng ta không thể dùng bit masking, vì khi dùng bit masking thì những thứ được đem ra mask cũng có cùng endianess với x thế nên byte đầu tiên sẽ luôn là 1.

Đoạn code ở trên dùng một cách thú vị hơn là dùng pointer casting, cast từ 1 pointer của 4 byte type về pointer của 1 byte type. Khi đó do pointer vẫn trỏ vào vị trí đầu tiên (mà nhìn trên hình sẽ thấy) nên nếu lấy giá trị của pointer này thì sẽ có giá trị của byte đầu tiên (theo endianess hiện tại).
Xem lại đoạn code thì if (*(char*)&x) chính là logic để check giá trị của byte đầu tiên đó, nếu nó là 1 thì sẽ là little endian, nếu là 0 thì sẽ là big endian

Đào sâu thêm một chút nữa, tại sao lại đẻ ra 2 loại endian làm gì cho phức tạp?

Theo như wikipedia thì

Big endian dùng chủ yếu cho network

Big-endian is the most common format in data networking; fields in the protocols of the Internet protocol suite, such as IPv4, IPv6, TCP, and UDP, are transmitted in big-endian order. For this reason, big-endian byte order is also referred to as network byte order.

Còn little endian dùng chủ yếu cho CPU

Little-endian storage is popular for microprocessors, in part due to significant influence on microprocessor designs by Intel Corporation.

Nghe cũng không thuyết phục lắm, tiếp tục google thì tìm được link trên quora hỏi về điểm mạnh điểm yếu của mỗi loại endian:

https://www.quora.com/What-are-the-advantages-of-using-Big-Endian-over-Little-Endian-in-a-computer-architecture

Trong các câu trả lời thì có câu trả lời khá thuyết phục :

Với big endian thì điểm lợi là thứ tự như suy nghĩ của con người (bên phải là nhỏ nhất), nên dễ debug.

Big endian's advantage:
Easier for human to read when examining memory values. This sometimes also applies to serializing/deserializing values when communicating with networks
No need to convert endianness when sending/receiving data to/from the network

Còn với little endian thì điểm lợi lại là dễ dàng cast từ một type lớn xuống 1 type nhỏ (ví dụ từ 32 bit xuống 16bit) do chúng ta không cần tính toán bit có giá trị nhỏ nhất nằm ở vị trí nào. Ngoài ra thì little endian (có vẻ) lợi về mặt tính toán mathematics operation hơn.

Little endian's advantage:

  • Always reads as the same value if reading in the size larger than or equal to the value. For example 20 = 0x14 if writing as a 64-bit value into memory at address A will be 14 00 00 00 00 00 00 00, and will always be read as 20 regardless using 8, 16, 32, 64-bit reads or actually any reads with length <= 64 at the address A like 24, 48 or 40 bits. This can be extend to arbitrarily longer types. In big-endian system you have to know in which size you have written the value in order to read it correctly, and to get the least significant byte you need to read at byte A+n-1 (with n is the length in bytes of the write) instead of A. This property also makes it easy to cast the value to a smaller type like int32_t to int16_t because the int16_t value will always the bytes at the beginning of int32_t.
  • Natural in computation. Mathematics operations mostly work from least to most significant digit, so it's much easier to work in little endian. For example a 32-bit computer but have limited memory bandwidth, only 16 bits (like some ARM microcontrollers) can do math with 16 bits at a time by reading a halfword at address A, add it then read the remaing halfword at A+2 and add instead of waiting for the two reads to be finished then adding from the LSB. This is extremely useful in Arbitrary-precision arithmetic (or any operations that are longer than the architecture's natural word size like doing 64-bit maths on 32-bit computers) because it would be much more painful to read the digits backwards and do operations.
Bình luận


White
{{ comment.user.name }}
Bỏ hay Hay
{{comment.like_count}}
Male avatar
{{ comment_error }}
Hủy
   

Hiển thị thử

Chỉnh sửa

White

huydx

116 bài viết.
944 người follow
Kipalog
{{userFollowed ? 'Following' : 'Follow'}}
Cùng một tác giả
White
148 14
Introduction (Link) là một cuộc thi ở Nhật, và cũng chỉ có riêng ở Nhật. Đây là một cuộc thi khá đặc trưng bởi sự thú vị của cách thi của nó, những...
huydx viết gần 2 năm trước
148 14
White
118 15
Happy programmer là gì nhỉ, chắc ai đọc xong title của bài post này cũng không hiểu ý mình định nói đến là gì :D. Đầu tiên với cá nhân mình thì hap...
huydx viết hơn 3 năm trước
118 15
White
95 10
(Ảnh) Mở đầu Chắc nhiều bạn đã nghe đến khái niệm oauth. Về cơ bản thì oauth là một phương thức chứng thực, mà nhờ đó một web service hay một ap...
huydx viết 3 năm trước
95 10
Bài viết liên quan
White
23 3
Nếu có thể trả lời chính xác câu hỏi sau và giải thích tại sao, bạn có thể bỏ qua bài này: 0.1 + 0.1 + 0.1 == 0.3 Trong Python, biểu thức này t...
HVN_FAMILUG viết hơn 1 năm trước
23 3
{{like_count}}

kipalog

{{ comment_count }}

bình luận

{{liked ? "Đã kipalog" : "Kipalog"}}


White
{{userFollowed ? 'Following' : 'Follow'}}
116 bài viết.
944 người follow

 Đầu mục bài viết

Vẫn còn nữa! x

Kipalog vẫn còn rất nhiều bài viết hay và chủ đề thú vị chờ bạn khám phá!