如何检查系统是大端还是小端?


Answers:


82

在C,C ++中

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

另请参阅:Perl版本


14
好的答案,但这提供了一个很好的示意图:stackoverflow.com/a/12792301/803801
gsingh2011 2013年

3
你能告诉我为什么我们不能仅仅使用(char)n == 1吗?为什么我们必须获取地址,将其转换为char指针然后取消引用?不会使用隐式完成(char)n吗?
J ... S

@J ... S仅使用字符转换似乎可以正常工作。我还没有在大端系统上对其进行测试。
FelisPhasma

1
仅使用字符不起作用。由于强制转换为char导致系统从int转换为char。它将始终返回true。使用强制转换指针和取消引用将指针放置到N的第一个字节,然后取消引用第一个字节。
Garret Gang

1
演员不是转换。如果是Big Endian,则N的第一个字节为零-那么,结果如何呢?
belwood


12

另一个使用联合的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使用的逻辑相同。


3
我认为这不符合标准:您只能从上次写的枚举中读取该字段,否则可能会出现不确定的行为,还是我误会了?
worenga '16

1
工会未在标准中指定“合理化”。这不是正确的解决方案(它可能在特定的OS /编译器中意外运行)。
jaskmar,2013年

能不能请您解释一下以上程序中的逻辑。如果使用x.1 = 1初始化成员变量i,那么xc [0]的结果如何为1。我的理解是,联合会占用最大数据类型的内存,并取决于我们可以访问它。只能访问一个成员。任何回应都将得到高度评价
Vivek Singh

如您所说,@ VivekSingh联合会占用最大数据类型的内存,并取决于我们可以访问它。因此,这两种数据类型的内存将相同。因此,我们将其作为int进行访问并将其分配为1。因此,在4个字节中,只有1个字节的部分将具有单个1。
Neeraj

9

如果使用的是.NET:检查的值BitConverter.IsLittleEndian


9

Perl的单行代码(应在几乎所有系统上默认安装):

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

如果输出以1(最低有效字节)开头,则为小尾数系统。如果输出以较高的数字(最高有效字节)开头,则为big-endian系统。请参阅Config模块的文档。


5

在C ++ 20中使用std::endian

#include <bit>
#include <iostream>

int main() {
    if constexpr (std::endian::native == std::endian::little)
        std::cout << "little-endian";
    else if constexpr (std::endian::native == std::endian::big)
        std::cout << "big-endian";
    else
        std::cout << "mixed-endian";
}

3

在Linux中,


与Neeraj的版本有何不同?
phuclv '16

2

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";
}


1

在C中

#include <stdio.h> 

/* function to show bytes in memory, from location start to start+n*/
void show_mem_rep(char *start, int n) 
 { 
      int i; 
      for (i = 0; i < n; i++) 
      printf("%2x ", start[i]); 
      printf("\n"); 
 } 

/*Main function to call above function for 0x01234567*/
int main() 
{ 
   int i = 0x01234567; 
   show_mem_rep((char *)&i, sizeof(i));  
   return 0; 
} 

当上述程序在小字节序计算机上运行时,给出“ 67 45 23 01”作为输出,而如果在大字节序计算机上运行,​​则给出“ 01 23 45 67”作为输出。


嘿,伙计,这不是您自己的代码,您只需复制和粘贴即可。您至少应注意代码的来源。
胡西溪

1

在Rust中(需要字节顺序条板箱):

use std::any::TypeId;

let is_little_endian = TypeId::of::<byteorder::NativeEndian>() == TypeId::of::<byteorder::LittleEndian>();

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.