AMDベースのマシンは、リトルエンディアンまたはビッグエンディアンを使用しますか?
-
06-07-2019 - |
質問
コンピューターシステムコースを受講し、AMDベースのコンピューターがリトルエンディアンのマシンである場合、確かに確立しようとしていますか? Intel互換になるからだと思います。
具体的には、私のプロセッサーはAMD 64 Athlon x2です。
これは、Cプログラミングで問題になることを理解しています。私はCプログラムを書いていますが、私が使用しているメソッドはこの影響を受けます。 Intelベースのマシンでプログラムを実行した場合と同じ結果が得られるかどうかを判断しようとしています( リトルエンディアンマシンと仮定)。
最後に、これを聞かせてください:Windows(XP、Vista、2000、Server 2003など)を実行できるすべてのマシンと、たとえば Ubuntu Linuxデスクトップはリトルエンディアンですか?
ありがとう、
フランク
解決
すべての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;
}
他のヒント
エンディアンを知る簡単な方法は、記事 Cでのエンディアンに依存しないコードの記述
const int i = 1;
#define is_bigendian() ( (*(char*)&i) == 0 )
Pythonがインストールされていると仮定すると、この「ワンライナー」を実行できます。リトルエンディアンのマシンと「ビッグ」でビッグエンディアンのもの:
python -c "import struct; print 'little' if ord(struct.pack('L', 1)[0]) else 'big'"
&quot; Intel互換&quot;正確ではありません。
Intelは、ビッグエンディアンプロセッサ、特にStrongARMとXScaleを製造していました。これらは、一般にx86として知られるIA32 ISAを使用しません。
過去にさかのぼると、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)(ビッグエンディアン)ポートがあるとは思わない。
最後の質問への回答では、答えはノーです。 Linuxは、旧世代のPowerMacなどのビッグエンディアンマシンで実行できます。
ビッグエンディアンマシン用に設計されたUbuntuのバージョンをダウンロードする必要があります。 PowerPC バージョンのみを知っています。より一般的なビッグエンディアンの実装がある場所を見つけることができると確信しています。
/* 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);
* macroは実際の関数を呼び出し、BEに変換します
BEの場合
<*>*マクロは関数ではなく単語として定義され、あなたの番号は括弧で囲まれます