C プログラムは、(コンパイル時ではなく) 実行時に、リトル エンディアンまたはビッグ エンディアンのどちらの CPU で実行されているかをどのように判断しますか?
「コンパイル時」ではなく「実行時」チェックでなければならない理由は、Intel-CPU を搭載した MAC を使用して、MAC OSX のユニバーサル バイナリ形式でプログラムをビルドしているためです。そして、このプログラムは Intel と Power-PC の両方の CPU で動作することが期待されています。つまり、MAC 上の Universal Binary フォーマットを通じて、Intel-CPU を使用してプログラムを構築し、それを PPC CPU で実行したいと考えています。
CPU チェックを必要とする私のプログラムのロジックは、64 ビット整数のホストからネットワークへのバイト順変更関数です。現在、インテル CPU では問題なく動作しますが、PPC では機能しません。C関数は次のとおりです。
unsigned long long
hton64b (const unsigned long long h64bits) {
// Low-order 32 bits in front, followed by high-order 32 bits.
return (
(
(unsigned long long)
( htonl((unsigned long) (h64bits & 0xFFFFFFFF)) )
) << 32
)
|
(
htonl((unsigned long) (((h64bits) >> 32) & 0xFFFFFFFF))
);
}; // hton64b()
クロスプラットフォームの方法でこれを行うより良い方法はありますか?
ありがとう