在C ++程序中以编程方式检测字节顺序

是否有程序化的方法来检测你是否在大端或小端架构? 我需要能够编写将在Intel或PPC系统上执行的代码,并使用完全相同的代码(即无条件编译)。


我不喜欢基于类型双击的方法 - 它通常会被编译器警告。 这正是工会的目的!

int is_big_endian(void)
{
    union {
        uint32_t i;
        char c[4];
    } bint = {0x01020304};

    return bint.c[0] == 1; 
}

这个原则与其他人提出的类型案例相同,但这更清晰 - 根据C99,保证是正确的。 与直接指针转换相比,gcc更喜欢这一点。

这比在编译时修复字节序要好得多 - 对于支持多种体系结构的操作系统(例如Mac os上的胖二进制文件),这对ppc / i386都有效,否则很容易把它弄糟。


你可以通过设置一个int和遮蔽位来实现,但最简单的方法可能是使用内置的网络字节转换操作(因为网络字节顺序总是大端)。

if ( htonl(47) == 47 ) {
  // Big endian
} else {
  // Little endian.
}

位摆动可能会更快,但这种方式很简单,直接,并且不可能搞砸。


请看这篇文章:

这里有一些代码来确定你的机器是什么类型的

int num = 1;
if(*(char *)&num == 1)
{
    printf("nLittle-Endiann");
}
else
{
    printf("Big-Endiann");
}
链接地址: http://www.djcxy.com/p/61893.html

上一篇: Detecting endianness programmatically in a C++ program

下一篇: SQL Pane view within Visual Studio 2012 Database Project