質問
8 ビット プロセッサのメモリに int32 型の整数 (たとえば 8051) がある場合、その整数のエンディアン性をどのように識別できるでしょうか?コンパイラ固有のものですか?これはシリアル回線などでマルチバイトデータを送信する場合に重要だと思います。
解決
広い整数のためのネイティブサポートを持っていない8ビット・マイクロコントローラを使用すると、メモリに保存されている整数のエンディアンがアップコンパイラライターに確かである。
広く8051上で使用されるSDCCコンパイラ、リトルエンディアン形式で格納する整数(そのコンパイラのユーザガイドは、それが原因のデータポインタをインクリメントするための命令が存在するため、そのアーキテクチャに、より効率的であると主張しますではなく、1デクリメントのために)。
他のヒント
は、エンディアンネスを持っている可能性がある。
http://69.41.174.64/forum/printable.phtml?id= 14233&スレッド= 14207 には8051が異なる場所で異なるエンディアンネスをミックスすることを示唆している。
エンディアンのCPUアーキテクチャに特有です。コンパイラは、特定のCPUをターゲットにする必要があるため、コンパイラは、同様にエンディアンの知識を持っているでしょう。あなたのコードは、複数のアーキテクチャをサポートする必要がある場合は特に - あなたはシリアル接続、ネットワークなどを介してデータを送信する必要があるのであれば、あなたはネットワークバイト順にデータを置くために、ビルドイン機能を使用することをお勧めします。
詳細については、以下を参照してください。のhttp:// WWW .gnu.org / S / libcの/マニュアル/ html_node /バイトOrder.html の
それはちょうど、コンパイラまでではありません - '51は、コンパイラが従わなければならない与えられたエンディアンの(変種でDPTR、標準でPC、ADC_IN、DAC_OUTなど)いくつかのネイティブ16ビットレジスタを持っている - しかし、それの外に、コンパイラは、プロジェクト設定で選択した任意のそれが好むエンディアンまたは1つを使用して自由である...
整数にはエンディアン性がありません。バイトを見ただけでは、それがビッグエンディアンなのかリトルエンディアンなのかを判断することはできません。知っておくべきことは次のとおりです。たとえば、8 ビット プロセッサがリトル エンディアンで、ビッグ エンディアンであることがわかっているメッセージを受信した場合 (たとえば、フィールド バス システムがビッグ エンディアンを定義しているため)、8 ビットを超える値を変換する必要があります。これをハードコーディングするか、システム上でどのバイトを交換するかを定義する必要があります。
バイトの交換は簡単であることに注意してください。ビット フィールド内のビットの順序はコンパイラ固有であるため、ビット フィールド内のビットを交換する必要がある場合もあります。繰り返しますが、基本的にはビルド時にこれを知っておく必要があります。
unsigned long int x = 1;
unsigned char *px = (unsigned char *) &x;
*px == 0 ? "big endian" : "little endian"
xが値1を割り当てられている場合、次に、値1は最下位バイトであろう。 私たちはその後、バイトへのポインタであることがXをキャストした場合、ポインタは、xの最小のメモリ位置を指します。そのメモリ位置が0である場合には、それ以外の場合は、リトルエンディアンで、ビッグエンディアンです。
#include <stdio.h>
union foo {
int as_int;
char as_bytes[sizeof(int)];
};
int main() {
union foo data;
int i;
for (i = 0; i < sizeof(int); ++i) {
data.as_bytes[i] = 1 + i;
}
printf ("%0x\n", data.as_int);
return 0;
}
出力を解釈することはあなた次第です。