2011-12-20 26 views

回答

47

爲什麼你需要一個圖書館,如果你能找到它這樣? :)

int num = 1; 

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

也許可以解釋爲什麼這個工程像@Eric J.低於 – bjackfly 2013-08-09 04:00:45

+9

int num = 1將根據字節順序存儲爲000.0001或100.000。 (char *)&num將指向該int的第一個字節。現在如果該字節讀取1,那麼它的小端序列或其他大端序列。 – hasanatkazmi 2014-04-17 02:25:43

+1

@hasanatkazmi你怎麼知道計算機是以2字節還是4字節存儲數字?另外,爲什麼你使用7位呢? – 2016-01-20 18:33:06

5

我不知道庫函數。

您可以獲取整數的地址,然後將該地址視爲字符指針並將數據寫入組成該整數的字節。然後,讀出整數中的實際內容,看看是否得到與大端或小端架構一致的結果。

1

這樣做沒有標準功能(如C標準或POSIX標準)。

如果您的電腦是運行英特爾(Windows風格)的個人電腦,它是小端。

如果你想找到你的機器上的字節順序,可以使用不能完全定義的行爲(但它通常工作 - 我沒有聽說過的任何地方,它不工作),這種技術:

enum { BigEndian, LittleEndian }; 

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

此代碼確實假定32位int類型(而不是64位或16位)。

+0

爲什麼不'u.i = 1;返回u.b [0] == 1? LittleEndian:BigEndian;'?這樣你就不必擔心int大小。 – 2016-09-27 10:41:48

+0

@MartinBonner:那也可以。 – 2016-09-27 13:26:38

5

使用此代碼:

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

您不需要「else if」 - 「else」就足夠了如果它不是很小的話,那就是很大的問題。 – Artur 2016-02-28 17:37:38

+2

@Artur:哈哈哈哈!還有其他的選擇:PDP11以big-endian的順序使用16位字......小字節順序中的字節(它可能反之亦然 - 剛纔是現在)。 – 2016-09-27 10:39:23

相關問題