Big endian và little endian là gì, bit endian và little endian trong lập trình

Bài viết gốc: https://manhhomienbienthuy.bitbucket.io/2018/Sep/20/little-endian-vs-big-endian.html (đã xin phnghiền người sáng tác


*

)

Little endian cùng big endian, đây là hai phương thức khác biệt nhằm tàng trữ tài liệu dạng nhị phân (binary). Bình hay thì bọn họ cũng chẳng phải quyên tâm đến bọn chúng làm những gì. Bởi phần đông vấn đề sẽ được tự động hoá hết.quý khách hàng đang xem: Endian là gì

Thế nhưng lại bao gồm trường hợp, ví dụ Lúc cần giải pháp xử lý những tập tin gồm cấu trúc, tập tin binary, duy nhất là mọi tập tin được ghi bởi ngôn ngữ khác, thì vấn đề phát âm về little endian và big endian là khôn cùng quan trọng. Bởi còn nếu không, cực kỳ rất có thể họ đang đọc không nên máy tự cùng xử trí với dữ liệu được đọc sai.quý khách sẽ xem: Endian là gì

Dữ liệu

Dữ liệu là biểu thị của biết tin dưới dạng tàng trữ được. Thông tin là lắp thêm trừu tượng, không có mẫu mã, đó là phần đa gọi biết về các sự thiết bị, vấn đề bao phủ bọn họ. Để lưu trữ, cũng như truyền đạt thông báo cho đầy đủ tín đồ, bọn họ nên cho tài liệu. Dữ liệu rất có thể là chữ viết, hình ảnh được ghi trên chứng từ, tất cả bọn họ dữ liệu mà con tín đồ có thể đọc được.

Bạn đang xem: Big endian và little endian là gì, bit endian và little endian trong lập trình

Nhưng hồ hết dữ liệu kia rất cần phải được mã hoá một lần tiếp nữa, nếu như bọn họ hy vọng lưu trữ chúng trên máy tính. Như họ phần đa biết, máy tính xách tay chỉ làm việc cùng với dữ liệu được mã hoá dưới dạng nhị phân, vậy cần số đông dữ liệu cần được mã hoá thành nhị phân mới rất có thể cách xử trí trên máy tính được.

Thực ra vấn đề này chỉ đúng với máy tính số (digital electronic computer). Nghe nói bây giờ laptop lượng tử, laptop sinch học tập cũng đang được cải cách và phát triển, hy vọng trong vài năm tới, họ đã update lại kiến thức về tài liệu.

Thực ra, máy vi tính không hiểu nhiều được các cam kết tự 0, 1 trong hệ nhị phân đâu, nó vận động theo các biểu đạt điện tử. Mô tả đúng đắn thì rất khó, tuy nhiên chúng ta cũng có thể đọc "sơ sơ" rằng, chạm mặt bit 1 thì sẽ sở hữu dòng diện, gặp mặt bit 0 thì không có. vì vậy, những bit 0, 1 được cách xử lý thành những biểu đạt điện tử khớp ứng, cùng bọn họ coi kia nhỏng máy vi tính đang gọi được tài liệu nhị phân.

Thế tuy thế, tuy vậy thuộc sử dụng biểu thị dạng nhị phân, các máy tính xách tay khác biệt cũng không thực sự nói chung một ngôn ngữ. Cũng hệt như coi fan vậy, khi quan sát những ký tự a, b, c bao gồm tín đồ phát âm, gồm tín đồ không. Máy tính Lúc nhìn vào các biểu đạt tương xứng với những cam kết hiệu 0 hay như là một, từng máy tính rất có thể phát âm theo một biện pháp không giống nhau.

Thế nhưng mà, hết sức may là các máy tính xách tay vẫn vận động theo đa số tiêu chuẩn thông thường, thế nên nó vẫn có thể giao tiếp cùng nhau được. Tuy nhiên, để ý rằng, không phải bất cứ cơ hội làm sao, các máy tính cũng hoàn toàn có thể đọc được lẫn nhau.

Trong máy tính, các tài liệu nhị phân ko được cách xử trí theo từng bit cá biệt, nhưng mà được giải pháp xử lý thành từng khối 8 bit một, và đơn vị chức năng cách xử lý nhỏ dại duy nhất này điện thoại tư vấn là byte.

lấy một ví dụ, số nguyên ổn 123456789 được trình diễn dưới dạng nhị phân đã là (tại đây tôi cho rằng thứ hạng dữ liệu int sẽ có được form size là 4 byte, tuy vậy, các hệ thống 64 bit vẫn nâng kích cỡ này lên 8 byte)

00000111 01011011 11001101 00010101Để ngắn thêm gọn, bạn cũng có thể viết nó bên dưới dạng hexa nhỏng sau:

07 5b cd 15Đã tất cả lúc nào, các bạn trường đoản cú hỏi, Khi ghi dữ liệu này trên đĩa cứng ví dụ điển hình, nó được ghi vắt nào không. Quý khách hàng nhận định rằng, nó sẽ được ghi lần lượt theo vật dụng từ nhưng mà bọn họ vẫn phát âm với viết làm việc bên trên, thì các bạn vẫn nhầm.

Đây là phương pháp viết theo phong cách số Ả rập cho bọn họ dễ hiểu thôi, máy tính ko "đọc" các ký kết từ bỏ hệt như họ cho nên nó cũng không lưu trữ giống phương pháp chúng ta viết các ký kết trường đoản cú này ra đâu. Việc ghi tài liệu ra sao chính là cơ hội little endian với big endian được dùng mang lại.

Little endian cùng big endian là gì?

Little endian và big endian là nhì phương thức khác nhau để lưu trữ dữ liệu. Sự khác hoàn toàn của little endian với big endian Lúc tàng trữ chính là nghỉ ngơi việc bố trí sản phẩm công nghệ tự những byte dữ liệu.

Trong hình thức lưu trữ little endian (bắt nguồn từ "little-end" nghĩa hoàn thành nhỏ hơn), byte ở đầu cuối trong biểu diễn nhị phân trên sẽ tiến hành ghi trước. lấy một ví dụ 123456789 ghi theo kiểu little endian vẫn thành

15 cd 5b 07Hơi ngược một chút đúng không? Big endian (bắt đầu từ "big-end") thì trở lại, là hình thức ghi dữ liệu theo lắp thêm trường đoản cú bình thường nhưng chúng ta vẫn sử dụng. 123456789 được tàng trữ vẫn theo đúng thiết bị từ là

07 5b cd 15Các thuật ngữ big-end tuyệt little-over xuất phát từ cuốn tè thuyết Gulliver du ký kết (Gulliver"s Travels), trong các số ấy nhân đồ vật Lilliputans tranh luận về việc cần đập trứng bởi đầu to lớn giỏi nhỏ.

Và ngành IT đang ứng dụng thuật ngữ ngày, kha khá tương tự cùng với nghĩa cội. Lưu ý rằng, little endian xuất xắc big endian chỉ khác nhau sống giải pháp thu xếp những byte dữ liệu, còn trang bị tự từng bit trong byte thì giống như nhau. Rất may, những máy tính xách tay vẫn đang còn điểm trung này.

Thêm một để ý nữa rằng, little endian giỏi big endian chỉ khác biệt Khi cần lưu trữ những tài liệu có rất nhiều byte. Những dữ liệu chỉ có 1 byte (ví dụ cam kết từ ASCII) thì ko tác động gì (đúng là mặc dù sử dụng cách thức nào hiệu quả tương tự như nhau)

Little endian cùng big endian được dùng trên hầu như máy tính xách tay nào?

Việc thu xếp những byte tài liệu theo phong cách little endian tốt big endian không chỉ có xảy ra lúc chúng ta lưu trữ tài liệu ra bộ lưu trữ xung quanh. Mọi buổi giao lưu của laptop đa số sử dụng dữ liệu nhị phân, đề nghị little endian/big endian hiện hữu vào mọi hoạt động của laptop.

Ngoài vấn đề áp dụng little endian/big endian một phần phụ thuộc vào vào ứng dụng (vày thiết kế viên cố kỉnh ý áp dụng một trong các hai các loại, hoặc ngôn từ lập trình sẵn công cụ trước), nó còn phụ thuộc vào vào bộ vi giải pháp xử lý của chính máy vi tính đó.

Các cỗ vi cách xử lý Hãng sản xuất Intel phần đa áp dụng little endian, những bộ vi cách xử lý cả ARM trước đó cũng là little endian, cơ mà hiện này ARM đã nâng cấp vi cách xử lý của mình thành bi-endian (có nghĩa là giải pháp xử lý cả little endian và big endian).

Các bộ vi cách xử trí PowerPC cùng SPARK trước đây đông đảo là big endian, tuy thế hiện giờ bọn chúng cũng khá được tăng cấp thành bi-endian.

Các có tác dụng như thế nào thì xuất sắc hơn: little endian hay big endian?

Little endian hay big endian cũng như tranh biện gốc về việc đập trứng, không tồn tại một cách làm như thế nào thực thụ tốt rộng thủ tục như thế nào.

Little endian giỏi big endian chỉ không giống nhau ở vấn đề tàng trữ đồ vật tự các byte tài liệu. Cả hai thủ tục phần đông ko làm cho tác động cho vận tốc xử trí của CPU. Thế cần cả nhì cách tiến hành mọi vẫn vĩnh cửu song song với sẽ không còn lúc nào rất có thể gồm một câu trả lời thoả đáng: Phương thức nào thì xuất sắc hơn?

Mỗi phương thức đều phải sở hữu gần như điểm mạnh nhất mực. Với little endian, do byte nhỏ tuổi tốt nhất luôn nằm cạnh trái, nó vẫn chất nhận được bọn họ hiểu tài liệu với độ nhiều năm tuỳ ý. Nó sẽ rất phù hợp trường hợp họ đề nghị ép hình dạng, ví dụ trường đoản cú int thành long int.

Với đưa định int là 4 byte, long int là 8 byte, giả dụ sử dụng little endian, Khi ép hình dạng, tương tác bộ nhớ lưu trữ không cần thiết phải thay đổi, họ chỉ việc ghi tiếp các byte lớn hơn mà thôi.

Nhưng nếu cũng trường phù hợp đó, nhưng mà sử dụng big endian, thì bọn họ sẽ yêu cầu dịch liên tưởng bộ nhớ lưu trữ bây chừ thêm 4 byte nữa mới có không gian nhằm lưu trữ.

Nhưng big endian cũng có thể có nhưng lại lợi thế nhất thiết, cùng với vấn đề gọi tài liệu byte lớn số 1 trước, nó sẽ tương đối dễ ợt khám nghiệm một số là âm hay dương, bởi vì byte đựng dấu được hiểu trước tiên.

Xem các byte tài liệu vào bộ nhớ

#include /* function to show bytes in memory, from location start to lớn start+n */voidshow_mem_rep (char *start, int n) int i; for (i = 0; i n; i++) printf (" %.2x", start); printf ("");/* Main function khổng lồ gọi above function for 0x01234567 */intmain () int i = 0x01234567; show_mem_rep ((char *) &i, sizeof (i)); return 0;Khi xúc tiến chương trình bên trên, ví như sản phẩm của doanh nghiệp là little endian thì hiệu quả vẫn là

67 45 23 01còn nếu như thiết bị chúng ta là big endian thì nó sẽ hiển thị theo máy từ thông thường

01 23 45 67Có bí quyết làm sao nhằm xác minh máy tính của bọn họ là little endian hay big endian hay không? Có vô số những biện pháp không giống nhau, bên dưới đấy là một trong các những phương pháp đó:

Nếu máy vi tính của bọn họ là little endian thì byte trước tiên này vẫn là một trong những, ngược lại thì nó đã là 0.

Xem thêm: Hướng Dẫn Ép Xung Card Đồ Họa Bằng Phần Mềm, Cách Ép Xung Card Màn Hình Máy Tính

Điều này ảnh hưởng cố nào đến sự việc lập trình

Về cơ phiên bản thì little endian xuất xắc big endian không tồn tại ảnh hưởng lắm đến sự việc xây dựng. Phần mập các lập trình sẵn viên không bắt buộc quan tâm nhiều lắm, vì hồ hết vấn đề đã làm được các trình biên dịch/thông dich đảm nhận không còn.

Tuy nhiên, một số trong những ngôi trường hợp, chúng ta bắt buộc quan tâm, đặc trưng Lúc biến đổi tài liệu thân các máy tính khác nhau. Ví dụ: khi họ yêu cầu cách xử trí một file bao gồm kết cấu nỗ lực này, 4 byte trước tiên là một vài ngulặng n, sau đó là n số nguyên ổn, từng số chiếm 4 byte bộ nhớ, v.v...

Trong ngôi trường vừa lòng này, Khi nhận file được tạo ra xuất phát từ 1 máy tính không giống, việc nó được ghi theo phong cách little endian giỏi big endian rõ ràng là tác động khôn cùng nghiêm trọng, nếu như áp dụng không đúng cách tiến hành, họ sẽ bỏ túi dữ liệu không đúng.

Một ngôi trường đúng theo không giống nữa rất có thể xẩy ra sự việc là lúc họ xay dạng hình cho các biến

#include intmain () unsigned char arr = 0x01, 0x00 ; unsigned short int x = *(unsigned short int *) arr; printf ("%d", x); return 0;Trong đoạn code bên trên, họ vẫn ép hình dáng một array nhị phần tử char thành một số ngulặng 2 byte (short int). Trong ví dụ này, little endian xuất xắc big endian cũng có thể có ảnh hưởng không nhỏ.

Một máy tính xách tay sử dụng little endian sẽ có công dụng là một trong khi big endian đang mang đến tác dụng là 256. Để tách đa số lỗi đáng tiếc hoàn toàn có thể xảy ra, phần nhiều code như trên rất cần phải tránh.

Vấn đề NUXI

NUXI là một trong vụ việc khôn xiết danh tiếng tương quan mang lại little endian với big endian: UNIX được lưu lại trong một hệ thống big-endian sẽ tiến hành phát âm là NUXI trong một khối hệ thống little endian.

Giả sử bọn họ đề xuất lưu trữ 4 byte (U, N, I, X) bằng nhị số nguyên dạng short int: UN cùng IX.

#include intmain () short int *s; // pointer khổng lồ phối shorts s = (short int *)malloc(sizeof(short int)); // point to lớn location 0 *s = "UN"; // store first short: U * 256 + N (fictional code) s += 2; // point khổng lồ next location *s = "IX"; // store second short: I * 256 + X return 0;Đoạn code bên trên hoàn toàn tự do với hệ thống, bất cứ nó là little giỏi big endian. Nếu bọn họ lưu trữ các giá trị "UN" với "IX" lúc phát âm ra, nó vẫn sẽ là "UNIX" tốt không? Nếu đầy đủ Việc chỉ xẩy ra bên trên một máy tính, mặc dù cho là big endian tốt little endian thì nó sẽ luôn là những điều đó, do đầy đủ đồ vật sẽ tiến hành auto hoá giúp bọn họ.

Với bất cứ dữ liệu nào thì cũng vậy, chúng ta luôn luôn chiếm được dữ liệu đúng nếu gọi cùng ghi vào cùng một khối hệ thống. Thế tuy thế, hãy xem xét kỹ rộng về bài toán bố trí các byte trong bộ nhớ lưu trữ.

Một khối hệ thống big endian sẽ lưu trữ nlỗi sau:

U N I XCòn một hệ thống little endian thì đang nhỏng sau:

N U X IMặc mặc dù trông hơi ngược nhưng khối hệ thống little endian đã cách xử lý việc phát âm giúp chúng ta, buộc phải tàng trữ những điều đó nhưng lúc kéo ra bọn họ vẫn có tài liệu ban đầu. Thế nhưng lúc bọn họ ghi tài liệu này ra tệp tin, đưa qua 1 laptop khác. Và mỗi máy vi tính lại giải pháp xử lý theo cách riêng rẽ của nó thì UNIX trên đồ vật big endian sẽ tiến hành đọc là NUXI trên thiết bị little endian (cùng ngược lại).

Đây đó là vấn hồ hết nguy hiểm nhất lúc chúng ta trao đỏi dữ liệu tương hỗ giữa những laptop cùng nhau, quan trọng đặc biệt trong thời đại Intethời buổi này.

Trao đổi dữ liệu thân những vật dụng gồm endian không giống nhau

Ngày ni, số đông laptop đều được liên kết để hiệp thương dữ liệu với nhau. Little endian giỏi big endian cũng đều nên Bàn bạc cùng nhau, nhưng làm cho vắt như thế nào để sở hữu phát âm được nhau Khi chúng ko nói bình thường một vật dụng tiếng?

Có 2 giải pháp bao gồm mang đến câu hỏi này

Sử dụng phổ biến định dạng

Một phương án đơn giản dễ dàng tuyệt nhất tất cả thực hiện tầm thường một định dang khi truyền tài liệu.

lấy một ví dụ đầy đủ tập tin dạng PNG đa số bắt buộc phải áp dụng big endian. Tương từ bỏ cùng với các tập tin có kết cấu không giống. Đó là lý do vày sao bọn họ nhiều khi rất cần được dùng những ứng dụng chuyên được dùng nhằm hiểu với ghi các tệp tin này.

Thế tuy vậy trong kết nối cùng với Internet, Việc truyền dữ liệu còn tinh vi không dừng lại ở đó. Chúng ta cần yếu cứ đọng cần sử dụng một định dạng tệp tin nào đó, rồi truyền từng byte một thanh lịch vật dụng không giống được. Muốn nắn tăng vận tốc, đề nghị chúng ta nên truyền nhiều byte một thời gian.

Và khi đó bọn họ cần phải có một chuẩn tầm thường. Hiện nay, chuẩn phổ biến mang lại vấn đề truyền dữ liệu bên trên mạng, điện thoại tư vấn là network byte order đó là big endian. Thế cơ mà, cho dù sẽ chuẩn phổ biến rồi, thỉnh phảng phất vẫn đang còn mọi giao thức nghịch chội rộng, áp dụng little endian.

Để có thể chuyển đổi dữ liệu thành tài liệu chuẩn chỉnh theo network byte order, lịch trình phải Hotline hàm hton* (host-to-network) (vào ngôn từ C). Trong hệ thống big endian, hàm này không nên làm gì cả, còn little endian vẫn triển khai chuyển đối các byte một chút.

Dù khối hệ thống big endian không cần thay đổi tài liệu, câu hỏi gọi hàm này vẫn luôn là khôn xiết quan trọng. Cmùi hương trình của bạn có thể được viết bằng một ngôn ngữ (C) dẫu vậy rất có thể được dịch và thực thi sinh sống nhiều hệ thống khác biệt, câu hỏi call hàm này để giúp đỡ họ có tác dụng điều ấy.

Tương trường đoản cú, sinh sống chiều ngược chở lại, họ cần hotline hàm ntoh* nhằm chuyển đổi dữ liệu cảm nhận từ bỏ mạng về tài liệu máy vi tính có thể hiểu được. Bên cạnh đó, chúng ta còn bắt buộc nắm rõ vẻ bên ngoài tài liệu mà lại chúng ta cần biến đổi nữa, danh sách những hàm chuyển đổi như sau:

htons - "Host lớn Network Short"htonl- "Host to lớn Network Long"ntohs - "Network to lớn Host Short"ntohl - "Network to Host Long"

Những hàm này cực kỳ đặc biệt Lúc triển khai chia sẽ dữ liệu ở tầng tốt, ví dụ lúc kiểm tra checksum của những gói tin ví dụ điển hình. Nếu không nắm rõ về little endian và big endian thì khi đề xuất thao tác về mạng, bạn sẽ gặp gỡ nhiều trở ngại.

Sử dụng BOM (Byte Order Mark)

Một phương án không giống nhằm giải quyết và xử lý sự khác biệt về endian là thực hiện BOM (Byte Order Mark). Đây là 1 trong ký tự quan trọng, có giá trị là 0xFEFF, được ghi ở phần đầu tiên của file.

Nếu độc giả ký tự này là 0xFFFE (bị ngược) thì gồm nghĩa file này được ghi với endian khác với khối hệ thống của doanh nghiệp, lúc đó, các bạn sẽ cần phải đổi khác cách thức đọc dữ liệu một ít.

Thđọng nhì, BOM ko trọn vẹn thần thánh, bởi nó nhờ vào vào lập trình viên. Có người dân có tâm thì hiểu cùng cách xử lý khi chạm chán BOM, bao gồm bạn thì trọn vẹn chẳng chú ý nó cùng coi nói như dữ liệu thông thường. Unicode thực hiện BOM Lúc tàng trữ dữ liệu nhiều byte (những cam kết từ Unicode được mã hoá thành 2, 3 thậm chí là là 4 byte).

Leave a Reply

Your email address will not be published. Required fields are marked *