我的基于AMD的机器是使用小端还是大端?

时间:2009-06-21 23:00:12

标签: c intel endianness amd-processor

如果我的基于AMD的计算机是一台小端机,我正在尝试建立一个计算机系统课程,并且我正在尝试建立肯定吗?我相信这是因为它与英特尔兼容。

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

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

最后,让我问一下:任何能够运行Windows(XP,Vista,2000,Server 2003等)的机器,以及Ubuntu Linux desktop是否都是小端的?

谢谢你,
弗兰克

8 个答案:

答案 0 :(得分:66)

所有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;
}

答案 1 :(得分:12)

文章Writing endian-independent code in C

中列出了一种了解endiannes的简便方法
const int i = 1;
#define is_bigendian() ( (*(char*)&i) == 0 )

答案 2 :(得分:11)

假设你安装了Python,你可以运行这个单行程序,它会在小端机器上打印“little”,在big-endian机器上打印“big”:

python -c "import struct; print 'little' if ord(struct.pack('L', 1)[0]) else 'big'"

答案 3 :(得分:6)

“与英特尔兼容”并不十分精确。

英特尔过去常常使用大端处理器,特别是StrongARM和XScale。这些不使用IA32 ISA,通常称为x86。

在历史上,英特尔还制造了小端i860和i960,它们也不兼容x86。

在历史上,x86(8080,8008等)的前身也不兼容x86。作为8位处理器,字节顺序并不重要......

如今,英特尔仍然生产Itanium(IA64),它是双端的:正常运行是big-endian,但处理器也可以在little-endian模式下运行。它确实能够以little-endian模式运行x86代码,但原生ISA不是IA32。

据我所知,AMD的所有处理器都是x86兼容的,有一些像x86_64这样的扩展,因此必然是小端的。

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

答案 4 :(得分:3)

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

答案 5 :(得分:2)

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

答案 6 :(得分: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。小端顺序将最低有效字节放在变量的地址中。所以它只是检查变量指针指向的地址处的字节值是否为0。 如果为0,则为小端字节序,否则为大端。

答案 7 :(得分: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

如果LE

unsigned long number1 = Function_Convert_to_be_16(number2);

*宏将调用实际函数,它将转换为BE

如果BE

unsigned long number1 = Function_Convert_to_be_16(number2);

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

之间