2011-12-20 28 views

Trả lời

47

Tại sao bạn cần thư viện nếu bạn có thể tìm thấy thư viện như thế này? :)

int num = 1; 

if (*(char *)&num == 1) 
{ 
    printf("Little-Endian\n"); 
} 
else 
{ 
    printf("Big-Endian\n"); 
} 
+0

có thể giải thích tại sao điều này hoạt động như @Eric J. không dưới – bjackfly

+9

int num = 1 sẽ được lưu trữ là 000.0001 hoặc 100.000 tùy thuộc vào độ dài. (char *) & num sẽ trỏ đến byte đầu tiên của int đó. bây giờ nếu byte đó đọc 1, thì cuối cùng nhỏ của nó là endian. – hasanatkazmi

+1

@hasanatkazmi Làm thế nào để bạn biết nếu máy tính sẽ lưu trữ số trong 2 byte hoặc 4 byte? Ngoài ra, tại sao bạn sử dụng 7 bit? –

5

Tôi không biết chức năng thư viện.

Bạn có thể lấy địa chỉ của một số nguyên, sau đó coi địa chỉ đó là con trỏ ký tự và ghi dữ liệu vào các byte bao gồm số nguyên. Sau đó, đọc ra những gì thực sự trong số nguyên và xem bạn có nhận được kết quả phù hợp với kiến ​​trúc cuối lớn hay nhỏ về cuối.

1

Không có chức năng tiêu chuẩn để làm như vậy (như trong tiêu chuẩn C hoặc tiêu chuẩn POSIX).

Nếu PC của bạn là PC (Windows-style) đang chạy Intel, thì nó rất nhỏ.

Nếu bạn muốn tìm thứ tự byte trên máy của mình, bạn có thể sử dụng hành vi không được xác định hoàn toàn (nhưng nó thường hoạt động - Tôi không nghe nói ở bất kỳ đâu nó không hoạt động) của kỹ thuật này:

enum { BigEndian, LittleEndian }; 

int endianness(void) 
{ 
    union 
    { 
     int i; 
     char b[sizeof(int)]; 
    } u; 
    u.i = 0x01020304; 
    return (u.b[0] == 0x01) ? BigEndian : LittleEndian; 
} 

Mã này giả định loại 32 bit int (thay vì 64 bit hoặc 16 bit).

+0

Tại sao không 'u.i = 1; trả về u.b [0] == 1? LittleEndian: BigEndian; '? Bằng cách đó bạn không phải lo lắng về kích thước int. –

+0

@MartinBonner: điều đó cũng sẽ hiệu quả. –

5

sử dụng mã này:

union 
{ 
    uint8 c[4]; 
    uint32 i; 
} u; 

u.i = 0x01020304; 

if (0x04 == u.c[0]) 
    printf("Little endian\n"); 
else if (0x01 == u.c[0]) 
    printf("Big endian\n"); 
+0

Bạn không cần "else if" - "else" là đủ kể từ nếu nó không phải là ít endianess nó là lớn endianess. – Artur

+2

@Artur: ha ha ha ha! Có các lựa chọn thay thế khác: PDP11 sử dụng các từ 16 bit theo thứ tự lớn ... với các byte trong từ theo thứ tự nhỏ (có thể đã được visa-versa - đã lâu rồi). –

Các vấn đề liên quan