34

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

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

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

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

4

9 に答える 9

74

すべての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;
}
于 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

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

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

「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)(ビッグエンディアン)ポートがあるとは思いません。

于 2009-06-21T23:38:58.200 に答える
3

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

于 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(10進数で256)で、長さは2バイトです。最下位バイトは00で、最上位バイトは01です。リトルエンディアンの順序付けにより、最下位バイトが変数のアドレスに配置されます。したがって、変数のポインタが指すアドレスのバイトの値が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

LEの場合

unsigned long number1 = Function_Convert_to_be_16(number2);

*マクロは実関数を呼び出し、BEに変換します

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 に答える