web-dev-qa-db-ja.com

AMDベースのマシンはリトルエンディアンまたはビッグエンディアンを使用しますか?

私はコンピュータシステムコースを受講していて、AMDベースのコンピュータがリトルエンディアンのマシンであるかどうかを確かに確立しようとしていますか? Intelと互換性があるからだと思います。

具体的には、私のプロセッサはAMD 64 Athlonx2です。

これはCプログラミングで問題になる可能性があることを理解しています。私はCプログラムを書いていますが、使用しているメソッドはこれによって影響を受けます。 Intelベースのマシンでプログラムを実行した場合に同じ結果が得られるかどうかを調べようとしています(リトルエンディアンのマシンであると想定しています) )。

最後に、これを聞いてみましょう。Windows(XP、Vista、2000、Server 2003など)を実行できるすべてのマシン、たとえば buntu Linuxデスクトップ はリトルエンディアンでしょうか?

ありがとうございました、
フランク

30
Frank V

すべてのx86およびx86-64マシン(x86の単なる拡張)はリトルエンディアンです。

次のように確認できます。

#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;
}
67
Mehrdad Afshari

エンディアンを知る簡単な方法は記事にリストされています Cでエンディアンに依存しないコードを書く

const int i = 1;
#define is_bigendian() ( (*(char*)&i) == 0 )
13
FCo

Pythonがインストールされていると仮定すると、このワンライナーを実行できます。これにより、リトルエンディアンのマシンでは「little」が出力され、ビッグエンディアンのマシンでは「big」が出力されます。

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

「Intel互換」はあまり正確ではありません。

Intelは、ビッグエンディアンプロセッサ、特にStrongARMとXScaleを製造していました。これらは、一般にx86として知られているIA32ISAを使用しません。

さらに歴史を遡ると、Intelはリトルエンディアンのi860とi960も製造しましたが、これらもx86とは互換性がありません。

さらに歴史を遡ると、x86の前身(8080、8008など)もx86と互換性がありません。 8ビットプロセッサであるため、エンディアンはそれほど重要ではありません...

現在でも、IntelはバイエンディアンであるItanium(IA64)を製造しています。通常の操作はビッグエンディアンですが、プロセッサはリトルエンディアンモードでも実行できます。たまたまx86コードをリトルエンディアンモードで実行できますが、ネイティブISAはIA32ではありません。

私の知る限り、AMDのすべてのプロセッサはx86互換であり、x86_64のようないくつかの拡張機能があるため、必然的にリトルエンディアンです。

Ubuntuはx86(リトルエンディアン)とx86_64(リトルエンディアン)で利用できますが、ia64(ビッグエンディアン)、ARM(el)(リトルエンディアン)、PA-RISC(ビッグエンディアンですが、プロセッサは、)、PowerPC(ビッグエンディアン)、およびSPARC(ビッグエンディアン)の両方をサポートします。ARM(eb)(ビッグエンディアン)ポートはないと思います。

6
ephemient

あなたの最後の質問への答えでは、答えはノーです。 Linuxは、旧世代のPowerMacなどのビッグエンディアンマシンで実行できます。

3

ビッグエンディアンマシン用に設計されたバージョンのUbuntuをダウンロードする必要があります。 PowerPC バージョンしか知りません。より一般的なビッグエンディアンの実装がある場所を見つけることができると確信しています。

2
mnuzzo
/* 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);

*マクロは関数ではなくWordとして定義され、番号は角かっこで囲まれます

1
Linas