2010-11-15 45 views

回答

57

在C,C++

int n = 1; 
// little endian if true 
if(*(char *)&n == 1) {...} 

參見:Perl version

+9

好的答案,但是這提供了一個很好的圖表:http://stackoverflow.com/a/12792301/803801 – gsingh2011 2013-10-15 23:17:09

+0

這真的是一個很好的圖 - 謝謝你添加它。 – belwood 2014-02-21 23:33:03

5

如果您使用的是.NET:請檢查BitConverter.IsLittleEndian的值。

8

另一個C代碼使用聯合

union { 
    int i; 
    char c[sizeof(int)]; 
} x; 
x.i = 1; 
if(x.c[0] == 1) 
    printf("little-endian\n"); 
else printf("big-endian\n"); 

它是belwood使用的相同的邏輯。

+2

雖然我認爲這不符合標準:您只能從最後一次寫入的枚舉中讀取該字段,否則可能會出現未定義的行爲,或者我誤會了? – worenga 2016-03-14 11:53:57

+0

工會沒有在標準中指定「證明」。這是不正確的解決方案(它可能會在特定的操作系統/壓縮機中意外工作)。 – jaskmar 2016-12-30 19:46:20

+0

有些人可以解釋一下上面的程序中的邏輯。如果初始化成員變量i,x.1 = 1,那麼x.c [0]如何變成1.我在這裏錯過了一些觀點嗎?我的理解是,union會記住最大的數據類型,並依賴於我們可以訪問的數據類型。只能訪問一個成員。任何迴應將被高度暗示 – 2018-02-13 08:44:52

0

A C++溶液:

namespace sys { 

const unsigned one = 1U; 

inline bool little_endian() 
{ 
    return reinterpret_cast<const char*>(&one) + sizeof(unsigned) - 1; 
} 

inline bool big_endian() 
{ 
    return !little_endian(); 
} 

} // sys 

int main() 
{ 
    if(sys::little_endian()) 
     std::cout << "little"; 
} 
+0

'reinterpret_cast'不能在常量表達式中使用。 – 2014-10-11 13:17:51

+0

@ T.C。爾加!太糟糕了。 Thnx :) – Galik 2014-10-11 13:30:50

0

在Linux中,`

static union { char c[4]; unsigned long mylong; } endian_test = { { 'l', '?', '?', 'b' } }; 
#define ENDIANNESS ((char)endian_test.mylong) 

if (ENDIANNESS == 'l') /* little endian */ 
if (ENDIANNESS == 'b') /* big endian */ 
+0

與Neeraj的版本有什麼不同? – 2016-07-29 09:56:13

10

在Python:

from sys import byteorder 
print(byteorder) 
+2

我覺得這是最簡單和最好的答案,謝謝! – mdandr 2017-02-10 18:44:37

0

一個班輪用Perl(其應該是默認上安裝幾乎所有系統):

perl -e 'use Config; print $Config{byteorder}' 

如果輸出以1(最低有效字節)開始,則它是一個小端系統。如果輸出以較高的數字(最重要的字節)開始,則它是一個大端系統。請參閱Config模塊的文檔。

相關問題