2010-11-15 40 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模块的文档。

相关问题