Little and Big Endian Mystery
Cải thiện bài viết
Lưu bài viết
Thích bài viết
- Độ khó. Dễ dàng
- Cập nhật lần cuối. 12 tháng 6 năm 2022
Cải thiện bài viết
Lưu bài viết
Cái gì đây?
Little và big endian là hai cách lưu trữ kiểu dữ liệu nhiều byte [ int, float, v.v.]. Trong các máy endian nhỏ, byte cuối cùng của biểu diễn nhị phân của kiểu dữ liệu nhiều byte được lưu trữ trước. Mặt khác, trong các máy big endian, byte đầu tiên của biểu diễn nhị phân của kiểu dữ liệu nhiều byte được lưu trữ trước tiên.
Giả sử số nguyên được lưu dưới dạng 4 byte [Đối với những người đang sử dụng trình biên dịch dựa trên DOS như C++ 3. 0, số nguyên là 2 byte] thì biến x có giá trị 0x01234567 sẽ được lưu trữ như sau
Làm cách nào để xem biểu diễn bộ nhớ của các loại dữ liệu nhiều byte trên máy của bạn?
Đây là mã C mẫu hiển thị biểu diễn byte của int, float và con trỏ.
c
#include
/* function to show bytes in memory, from location start to start+n*/
void
show_mem_rep[
char
*start,
int
n]
{
#include
0int
#include
2
#include
0#include
4 #include
5
#include
6#include
7#include
8#include
9_______2_______0
#include
0#include
7#include
8/* function to show bytes in memory, from location start to start+n*/
4/* function to show bytes in memory, from location start to start+n*/
5
/* function to show bytes in memory, from location start to start+n*/
6
/* function to show bytes in memory, from location start to start+n*/
7
int
/* function to show bytes in memory, from location start to start+n*/
9
{
void
1_______7_______ void
3
void
1_______3_______5_______5_______ void
7void
8void
9
void
1_______4_______1show_mem_rep[
2
void
1_______4_______4 show_mem_rep[
5
/* function to show bytes in memory, from location start to start+n*/
6
Thời gian phức tạp. Ô[1]
Không gian phụ trợ. Ô[1]
Khi chương trình trên được chạy trên máy endian nhỏ, cho đầu ra “67 45 23 01”, trong khi nếu chương trình chạy trên máy endian lớn, cho đầu ra “01 23 45 67”
Có cách nào nhanh chóng để xác định độ bền của máy của bạn không?
không có. các cách để xác định tuổi thọ của máy của bạn. Đây là một cách nhanh chóng để làm như vậy.
C++
show_mem_rep[
7
show_mem_rep[
8 show_mem_rep[
9 char
0
int
/* function to show bytes in memory, from location start to start+n*/
9
{
#include
0char
5int
char
7
#include
0char
*start,
0char
*start,
2
#include
0*start,
4 *start,
5
*start,
6*start,
7*start,
8*start,
9
#include
0int
1
*start,
6*start,
7int
4*start,
9
#include
0show_mem_rep[
4 show_mem_rep[
5
/* function to show bytes in memory, from location start to start+n*/
6
n]
0
C
#include
int
/* function to show bytes in memory, from location start to start+n*/
9
{
void
1_______5_______5int
char
7
void
1_______5_______ *start,
0char
*start,
2
void
1_______6_______4 {
6
{
7#include
7_______1_______8*start,
8_______2_______5
void
1int
1
{
7#include
7_______1_______8int
4_______2_______5
void
1_______4_______1show_mem_rep[
2
void
1_______4_______4 show_mem_rep[
5
/* function to show bytes in memory, from location start to start+n*/
6
đầu ra.
Little endian
Thời gian phức tạp. Ô[1]
Không gian phụ trợ. Ô[1]
Trong chương trình trên, một con trỏ ký tự c đang trỏ đến một số nguyên i. Vì kích thước của ký tự là 1 byte khi con trỏ ký tự không được tham chiếu nên nó sẽ chỉ chứa byte đầu tiên của số nguyên. Nếu máy là little endian thì *c sẽ là 1 [vì byte cuối cùng được lưu trước] và nếu máy là big endian thì *c sẽ là 0.
Độ bền có quan trọng đối với các lập trình viên không?
Hầu hết các lần trình biên dịch quan tâm đến tuổi thọ, tuy nhiên, tuổi thọ trở thành một vấn đề trong các trường hợp sau
Nó quan trọng trong lập trình mạng. Giả sử bạn viết các số nguyên vào tệp trên máy endian nhỏ và bạn chuyển tệp này sang máy endian lớn. Trừ khi có ít biến đổi endian thành big endian, máy big endian sẽ đọc tệp theo thứ tự ngược lại. Bạn có thể tìm thấy một ví dụ thực tế như vậy tại đây
Thứ tự byte tiêu chuẩn cho mạng là big endian, còn được gọi là thứ tự byte mạng. Trước khi truyền dữ liệu trên mạng, trước tiên dữ liệu được chuyển đổi thành thứ tự byte mạng [big endian].
Đôi khi nó quan trọng khi bạn đang sử dụng kiểu truyền, chương trình dưới đây là một ví dụ
c
#include
int
/* function to show bytes in memory, from location start to start+n*/
9
{
#include
0char
5_______5_______ #include
23
#include
0char
5_______1_______26 int
#include
28#include
26 int
#include
31
#include
0#include
7#include
8#include
35#include
36
#include
0show_mem_rep[
1show_mem_rep[
2
#include
0show_mem_rep[
4 show_mem_rep[
5
/* function to show bytes in memory, from location start to start+n*/
6
Thời gian phức tạp. Ô[1]
Không gian phụ trợ. Ô[1]
Trong chương trình trên, một mảng char được đánh kiểu thành một kiểu số nguyên ngắn không dấu. Khi tôi chạy chương trình trên trên máy endian nhỏ, tôi nhận được đầu ra là 1, trong khi nếu tôi chạy nó trên máy endian lớn, tôi nhận được 256. Để làm cho chương trình trở nên độc lập về tuổi thọ, nên tránh phong cách lập trình trên.
bi-endian là gì?
Bộ xử lý hai đầu có thể chạy ở cả hai chế độ cuối nhỏ và lớn
Các ví dụ về máy mini, big endian và bi-endian là gì?
Bộ xử lý dựa trên Intel là những người cuối cùng nhỏ bé. Bộ xử lý ARM là những người cuối cùng nhỏ bé. Bộ vi xử lý ARM thế hệ hiện tại là bi-endian
Bộ xử lý Motorola 68K là những người cuối cùng lớn. Bộ xử lý PowerPC [của Motorola] và SPARK [của Sun] là những bộ xử lý lớn. Phiên bản hiện tại của các bộ xử lý này là hai đầu cuối.
Độ bền có ảnh hưởng đến định dạng tệp không?
Các định dạng tệp có 1 byte làm đơn vị cơ bản không phụ thuộc vào độ bền e. g. , tệp ASCII. Các định dạng tệp khác sử dụng một số định dạng tuổi thọ cố định e. g, Các tệp JPEG được lưu trữ ở định dạng big endian.
Cái nào tốt hơn - endian nhỏ hay endian lớn?
Thuật ngữ endian nhỏ và lớn xuất phát từ Gulliver's Travels của Jonathan Swift. Hai nhóm không thống nhất được nên mở quả trứng ở đầu nào -a- nhỏ hay lớn. Cũng giống như vấn đề trứng, không có lý do công nghệ nào để chọn quy ước đặt hàng một byte thay vì quy ước khác, do đó các cuộc tranh luận biến thành tranh cãi về các vấn đề chính trị xã hội. Miễn là một trong các quy ước được chọn và tuân thủ một cách nhất quán, thì sự lựa chọn là tùy ý
Khuyến khích
Giải các bài toán DSA trên GfG Practice
Giải quyết vấn đề
Ghi chú cá nhân của tôi arrow_drop_up
Tiết kiệm