プログラムとして?
#include <stdio.h>
#include <stdint.h>
int main(int argc, char** argv) {
union {
uint32_t word;
uint8_t bytes[4];
} test_struct;
test_struct.word = 0x1;
if (test_struct.bytes[0] != 0)
printf("little-endian\n");
else
printf("big-endian\n");
return 0;
}
リトルエンディアン アーキテクチャでは、最下位バイトが最初に格納されます。ビッグ エンディアン アーキテクチャでは、最上位バイトが最初に格納されます。したがって、 auint32_t
を auint8_t[4]
でオーバーレイすることにより、どのバイトが最初に来るかを確認できます。参照: http://en.wikipedia.org/wiki/Big_endian
特に GCC は__BYTE_ORDER__
マクロを拡張子として定義します。__ORDER_BIG_ENDIAN__
、__ORDER_LITTLE_ENDIAN__
、および__ORDER_PDP_ENDIAN__
(存在することを知りませんでした!)に対してテストできます-- http://gcc.gnu.org/onlinedocs/cpp/Common-Predefined-Macros.htmlを参照してください
http://en.wikipedia.org/wiki/Big_endianも参照してください。
マシンのネイティブ エンディアンと一致しないエンディアンでコードを実行する場合は、エンディアンが異なるアーキテクチャでコンパイルして実行する必要があります。そのため、エミュレーターまたは仮想マシンでクロスコンパイルして実行する必要があります。
編集:ああ、私は最初のものを見ませんでしたprintf()
。
ビッグエンディアンのマシンは文字を int の最上位バイトとして解釈するため、最初のprintf
コマンドは "1633837924" を出力します。'a'
の値が との間でバイト単位でコピーされているため、 2 番目printf
は単に "abcd" を出力します。u
i