34

我正在学习计算机系统课程,并且我正在尝试确定我的基于 AMD 的计算机是否是 little-endian 机器?我相信这是因为它将与英特尔兼容。

具体来说,我的处理器是 AMD 64 Athlon x2。

我知道这在 C 编程中很重要。我正在编写 C 程序,而我正在使用的方法会受此影响。我试图弄清楚如果我在基于英特尔的机器上运行程序(假设小端机器)是否会得到相同的结果。

最后,让我问这个问题:任何和所有能够运行 Windows(XP、Vista、2000、Server 2003 等)以及比如说Ubuntu Linux 桌面的机器都是小端的吗?

4

9 回答 9

74

所有 x86 和 x86-64 机器(它只是 x86 的扩展)都是 little-endian。

您可以通过以下方式确认:

#include <stdio.h>
int main() {
    int a = 0x12345678;
    unsigned char *c = (unsigned char*)(&a);
    if (*c == 0x78) {
       printf("little-endian\n");
    } else {
       printf("big-endian\n");
    }
    return 0;
}
于 2009-06-21T23:01:14.110 回答
16

在用 C 编写与字节序无关的代码一文中列出了一种了解字节序的简单方法

const int i = 1;
#define is_bigendian() ( (*(char*)&i) == 0 )
于 2009-06-21T23:15:45.750 回答
12

Assuming you have Python installed, you can run this one-liner, which will print "little" on little-endian machines and "big" on big-endian ones:

python -c "import struct; print 'little' if ord(struct.pack('L', 1)[0]) else 'big'"
于 2009-06-24T04:38:58.337 回答
8

“英特尔兼容”不是很精确。

英特尔曾经制造过大端处理器,尤其是 StrongARM 和 XScale。这些不使用通常称为 x86 的 IA32 ISA。

再往前看,英特尔还制造了不兼容 x86 的 little-endian i860 和 i960。

再往前看,x86 的前身(8080、8008 等)也不兼容 x86。作为 8 位处理器,字节顺序并不重要......

现在Intel还在做Itanium(IA64),它是bi-endian:正常运行是big-endian,但处理器也可以运行在little-endian模式。它确实能够在 little-endian 模式下运行 x86 代码,但本机 ISA 不是 IA32。

据我所知,AMD 的所有处理器都与 x86 兼容,并带有一些扩展,例如 x86_64,因此必然是 little-endian。

Ubuntu 可用于 x86 (little-endian) 和 x86_64 (little-endian),对于 ia64 (big-endian)、ARM(el) (little-endian)、PA-RISC (big-endian) 的端口不太完整,尽管处理器同时支持)、PowerPC(大端)和 SPARC(大端)。我不相信有 ARM(eb)(大端)端口。

于 2009-06-21T23:38:58.200 回答
3

在回答你的最后一个问题时,答案是否定的。Linux 能够在大端机器上运行,例如老一代的 PowerMacs。

于 2009-06-21T23:06:12.417 回答
2

您必须下载专为大端机器设计的 Ubuntu 版本。我只知道PowerPC版本。我相信您可以找到一些具有更通用的大端实现的地方。

于 2009-06-21T23:14:17.283 回答
2

下面的代码片段有效:

#include <stdio.h>

int is_little_endian() {
  short x = 0x0100; //256
  char *p = (char*) &x;
  if (p[0] == 0) {
    return 1;
  }
  return 0;
}

int main() {
  if (is_little_endian()) {
    printf("Little endian machine\n");
  } else printf("Big endian machine\n");
  return 0;
}

代码中的“短”整数为 0x0100(十进制为 256),长度为 2 个字节。最低有效字节为 00,最高有效字节为 01。Little endian 排序将最低有效字节放在变量的地址中。所以它只是检查变量指针指向的地址的字节值是否为0。如果为0,则为小端字节序,否则为大端字节序。

于 2021-01-10T14:18:01.147 回答
1
/* by Linas Samusas  */

#ifndef _bitorder 
#define _bitorder 0x0008

#if (_bitorder > 8)
#define BE
#else
#define LE
#endif

并使用它

#ifdef LE
#define Function_Convert_to_be_16(value)  real_function_to_be_16(value)
#define Function_Convert_to_be_32(value)  real_function_to_be_32(value)
#define Function_Convert_to_be_64(value)  real_function_to_be_64(value)
#else
#define Function_Convert_to_be_16
#define Function_Convert_to_be_32
#define Function_Convert_to_be_64
#endif

如果

unsigned long number1 = Function_Convert_to_be_16(number2);

*macro 会调用真正的函数并转换为 BE

如果是

unsigned long number1 = Function_Convert_to_be_16(number2);

*宏将被定义为单词而不是函数,并且您的数字将在括号之间

于 2014-02-12T00:52:59.070 回答
0

我们现在有std::endian

constexpr bool is_little = std::endian::native == std::endian::little;

https://en.cppreference.com/w/cpp/types/endian

于 2022-02-10T11:39:02.087 回答