STDIO
Tìm kiếm gần đây

    Nội dung

    Little Endian Và Big Endian

    Rye Nguyen

    26/07/2015
    18/07/2020
    Little Endian Và Big Endian
    Thuật ngữ “big endian” và “little endian” diễn tả 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. Bài viết cung cấp kiến thức về big endian và little endian.

    Cũng như con người, máy tính cũng "nói" các ngôn ngữ khác nhau. Một số “đọc” và “ghi” từ trái sang phải, trong khi một số khác thì ngược lại. Một bộ máy có thể đọc và xử lý dữ liệu được tạo ra bởi nó một cách bình thường. Vấn đề xảy ra khi một bộ máy “khác loại” cố gắng đọc dữ liệu đó.

    Tổng quan

    Endian là cách tổ chức dữ liệu trên một nền tảng máy tính. Bộ nhớ máy tính có thể được xem như một mảng có kích thước lớn, chia làm nhiều ô, mỗi ô có kích thước 1 byte. Nếu dữ liệu của bạn có thể được gói gọn trong 1 byte, nghĩa là mỗi lần bạn chỉ xử lý 1 byte thì không có gì khác biệt.

    Vấn đề xảy ra khi dữ liệu của bạn vượt quá 1 byte, ví dụ như bạn cần lưu trữ một số nguyên. Khi đó 4 byte của biến số nguyên đó sẽ được lưu vào bộ nhớ máy tính theo thứ tự nào?

    Big Endian

    Đối với các nền tảng dùng big endian, Least Significant bit (LSB) luôn được lưu ở ô nhớ có địa chỉ lớn nhất còn Most Significant Bit (MSB) được lưu ở ô nhớ có địa chỉ nhỏ nhất trong vùng lưu trữ của biến. Trong đó, LSB là bit có trọng số nhỏ nhất, nằm ở ngoài cùng bên phải; MSB là bit có trọng số lớn nhất, nằm ở ngoài cùng bên trái của một biến.

    Big Endian
    Big endian

    Lưu trữ số nguyên 7411 vào bộ nhớ máy trên nền tảng dùng big endian. Ta cùng xét ví dụ sau:

    Số 7411 được viết dưới dạng nhị phân như sau:

    1 1100 1111 0011

    Minh họa việc lưu số 7411 vào bộ nhớ máy tính như sau:

    Big Endian

    Các nền tảng sử dụng Big Endian

    IBM zSeries, iSeries, AIX, NonStop Kernel, Motorola 68K…

    Little Endian

    Ngược lại với các nền tảng sử dụng big endian, ở các nền tảng sử dụng little endian, LSB luôn được lưu ở ô nhớ có địa chỉ nhỏ nhất còn MSB được lưu ở ô nhớ có địa chỉ lớn nhất trong vùng lưu trữ của biến.

    Xét lại ví dụ trên, việc lưu trữ số nguyên 7411 vào bộ nhớ máy tính được minh họa như sau:

    Little endian

    Các nền tảng sử dụng Little Endian

    Hầu hết các hệ thống sử dụng vi xử lý của Intel.

    Ưu điểm của Big Endian và Little Endian

    Big endian và little endian đều do con người sáng tạo nên và đều không gây ảnh hưởng đến tốc độ xử lý của CPU. Do đó sẽ không có câu trả lời hợp lý cho câu hỏi: cái nào lợi thế hơn cái nào?

    Với big endian, do dữ liệu được ghi từ trái qua phải, bạn sẽ dễ dàng kiểm tra một số là số dương hay số âm do bit dấu được lưu trữ ở bit đầu tiên của biến. Ta không cần biết số đó chiếm bao nhiêu byte, cũng như không cần nhảy qua byte nào để xác định byte lưu trữ dấu của số đó. Các số cũng được lưu trữ đúng như trình tự mà nó được hiển thị, do đó sẽ hiệu quả trong phép toán đổi từ nhị phân sang thập phân.

    Với little endian, một biến có thể được đọc với độ dài bất kì mà không cần phải thay đổi memory address. Do đó sẽ thuận tiện hơn trong các phép toán ép kiểu, chuyển kiểu, dễ dàng viết các phép toán phức tạp …

    Chuyển đổi giữa Big Edian và Little Endian

    Qua ví dụ ở trên, các bạn đã thấy được sự khác nhau giữa big endian và little endian. Điều này rất quan trọng trong lập trình đa nền tảng, vì các chương trình được viết ở nền tảng sử dụng big endian thì không thể sử dụng được các nền tảng khác sử dụng little endian. Muốn sử dụng được trước hết ta phải đồng bộ hai nền tảng bằng cách xem xét và đảo lại vị trí các byte cho phù hợp với hệ thống mới.

    Codes C++ chuyển đổi qua lại giữa Little Endian và Big Endian.

    // 2 bytes
    void EndianSwap (unsigned short& x)
    {
    	x = (x >> 8) | (x << 8);
    }
    
    // 4 bytes
    void EndianSwap (unsigned int& x)
    {
    	x = (x >> 24) |
    		((x << 8) & 0x00FF0000) |
    		((x >> 8) & 0x0000FF00) |
    		(x << 24);
    }
    
    // 8 bytes
    void EndianSwap (unsigned __int64& x)
    {
    	x = (x >> 56) |
    		((x << 40) & 0x00FF000000000000) |
    		((x << 24) & 0x0000FF0000000000) |
    		((x << 8)  & 0x000000FF00000000) |
    		((x >> 8)  & 0x00000000FF000000) |
    		((x >> 24) & 0x0000000000FF0000) |
    		((x >> 40) & 0x000000000000FF00) |
    		(x << 56);
    }

    Thảo luận

    In order to comment you must be a STDIO Insider. Please sign up or log in to continue.

    Đăng nhập

    Bài viết liên quan

    Biến Và Kiểu Dữ Liệu

    Biến Và Kiểu Dữ Liệu

    Biến trong C++ là 1 yếu tố cần thiết, và vì thế việc hiểu rõ bản chất, cách thức sử dụng biến một cách hiệu quả là cực kỳ quan trọng. Bài viết là những kiến thức cơ bản ...

    Phi Phạm

    16/04/2015

    Bản Chất Của Biến Trong C/C++

    Bản Chất Của Biến Trong C/C++

    Những ngày đầu được học và làm việc với các kiểu biến như int, float, char….Tôi luôn có những thắc mắc về:”Điều gì đang xảy ra bên trong biến int, char… khi ta cấp phát ...

    Trần Hữu Danh

    16/01/2015

    Hiện Thực Và Sử Dụng Hàm memcmp - memcpy - memset Trong C/C++

    Hiện Thực Và Sử Dụng Hàm memcmp - memcpy - memset Trong C/C++

    Trong quá trình làm việc tôi có nghiên cứu qua các hàm memcmp, memcpy và memset dùng để thao tác trên byte, biết rằng những hàm này sẽ cần sử dụng thường xuyên, nên tôi ...

    Shiro Nguyễn

    21/08/2015

    Đánh Dấu Và Kiểm Tra Bản Quyền Tài Liệu Số

    Đánh Dấu Và Kiểm Tra Bản Quyền Tài Liệu Số

    Với sự bùng nổ Internet như hiện nay, việc phát tán các phần mềm, băng đĩa lậu hay các ảnh, video có bản quyền không có xa lạ gì nữa. Người sử dụng máy vi tính dần dần ...

    STDIO Warehouse

    26/08/2015

    Con Trỏ trong C++ - Pointer

    Con Trỏ trong C++ - Pointer

    Tìm hiểu và hướng dẫn cách sử dụng con trỏ trong C/C++.

    Rye Nguyen

    28/07/2015

    Loop - For Và Foreach - While Và Do-While

    Loop - For Và Foreach - While Và Do-While

    Trong bài viết này tôi muốn giới thiệu đến các bạn cách tạo vòng lặp và các cách sử dụng vòng lặp khác nhau được hỗ trợ trong ngôn ngữ PHP. Bài viết các bạn lập trình ...

    Bùi Nguyễn Minh Hoàng

    28/08/2015

    Phân Biệt Compile và Interpret

    Phân Biệt Compile và Interpret

    Phân biệt 2 khái niệm Compile và Interpret, sự khác nhau và giống nhau giữa Compiler và Interpreter.

    Hiếu Nguyễn

    27/11/2014

    typedef Và enum

    typedef Và enum

    Trong quá trình lập trình, việc ghi nhớ và hiểu mã nguồn nhanh là cần thiết. Trong bài viết này, tôi giới thiệu đến các bạn hai kỹ thuật giúp hỗ trợ việc ghi nhớ và dễ ...

    Lê Minh Trung

    12/05/2015

    Phương Thức Truyền Và Nhận Dữ Liệu POST, GET Trong PHP

    Phương Thức Truyền Và Nhận Dữ Liệu POST, GET Trong PHP

    Chắc hẳn những ai đã từng học lập trình web đều biết đến khái niệm POST và GET để truyền và nhận dữ liệu. Như phương thức POST bảo mật hơn GET. Vậy vì sao lại có bảo mật ...

    Nguyễn Nghĩa

    07/10/2015

    Từ Khóa break Và continue

    Từ Khóa break Và continue

    Khi thao tác với vòng lặp trong C++, vòng lặp sẽ thực thi liên tục cho đến khi biểu thức điều kiện không còn đúng nữa. Tuy nhiên, đôi lúc chúng ta có một vài ngoại lệ, ...

    Rye Nguyen

    03/08/2015

    STDIO
    Trang chính
    Công ty TNHH STDIO

    30, Trịnh Đình Thảo, Hòa Thạnh, Tân Phú, Hồ Chí Minh
    +84 28.36205514 - +84 942.111912
    developer@stdio.vn

    383/1 Quang Trung, Phường 10, Quận Gò Vấp, Hồ Chí Minh
    Số giấy phép ĐKKD: 0311563559 do sở Kế hoạch và Đầu Tư TPHCM cấp ngày 23/02/2012

    ©STDIO, 2013 - 2020