記事のディレクトリ
1.大小の目的は何ですか
ビッグエンディアンとスモールエンディアンは、バイトをメモリに格納する2つの方法です。1つはビッグエンディアンストレージで、もう1つはリトルエンディアンストレージです。サイズモードを使用してデータエンドを格納する主な違いは、ストレージのバイト順序です。ビッグエンディアン方式では上位ビットが下位アドレスに格納され、リトルエンディアン方式では上位ビットが上位アドレス。ビッグエンディアン方式のデータストレージは通常の人間の考え方に沿ったものですが、リトルエンディアン方式のデータストレージはコンピューター処理に役立ちます。
ビッグエンディアンストレージ:数値のローエンディアンコンテンツはハイアドレスに保存され、ハイエンディアンコンテンツはローアドレスに保存されます。
リトルエンディアンストレージ:数値のローエンディアンコンテンツはローアドレスに保存され、ハイエンディアンコンテンツはハイアドレスに保存されます。
2.ビッグエンドの意味
インターネットで使用されるネットワークバイトオーダーはアドレス指定にビッグエンディアンモードを使用しますが、ホストバイトオーダーはプロセッサによって異なります。たとえば、PowerPCプロセッサはビッグエンディアンモードを使用し、Pentuimプロセッサはリトルエンディアンモードを使用します。。
PowerPCプロセッサがネットワーク市場を支配しているため、ほとんどの通信デバイスはプロトコル処理やその他の制御情報処理にPowerPCプロセッサを使用していると言えます。また、ネットワーク上のほとんどのプロトコルがビッグエンディアンアドレス指定を使用している可能性もあります。したがって、ネットワークプロトコルのソフトウェア設計では、リトルエンディアンモードを使用するプロセッサは、ソフトウェアのエンドモードの変更を処理する必要があります。
ペンティアム支配的なパソコン市場、パソコン用ので、大部分の周辺には、リトルエンディアンモードを使用しているネットワークデバイスのPCIバス、で使用されるいくつかのFlashもハードウェアエンジニアが注目変換のハードウェアの終了モードを設計必要とし、他の機器、。
3.サイズの終わりを決定する方法
3.1コンソーシアムを使用して検出する
3.1.1コンソーシアム
大小のエンディアンを検出する前に、まずC言語のユニオンとは何かを理解しましょう。
C言語では、連邦も呼ば組合であるキーワード、連合を。
共用体型を定義する一般的な形式は次のとおりです。
union 联合名
{
成员表
};
ユニオンが占めるバイト数は、そのメンバーの最大のデータ型が占めるバイト数と同じです。次に例を示します。
union Un
{
int a;
char b;
}un;
部材Aの組合は、int型の4つのバイトを占め、部材Bがので、char型であり、1つのバイトを占める組合国連がメモリ内の4つのバイトを占有し、そして組合のメンバーは、メモリ空間を共有することができ、メモリは次のように表すことができます。
ユニオンの特性により、bをインターセプトすることにより、バイトオーダーのストレージモード、つまりビッグエンディアンかスモールエンディアンかを知ることができます。
3.1.2コード検出
#include <stdio.h>
int Check_sys()
{
union Un
{
char c;
int i;
}un;
un.i = 1;
//如果是大端机则是0x1000 0000 0000 0000
//如果是小端机则是0x0000 0000 0000 0001
return un.c;
}
int main()
{
int ret=Check_sys();//由于联合体的特性,大端机ret=0(0000),小端机ret=1(0001)
if (1 == ret)
{
printf("当前模式为小端存储\n");
}
else
{
printf("当前模式为大端存储\n");
}
return 0;
}
出力結果:
3.2ポインタを使用して検出する
int型のポインタが4だけオフセットされるたびに、バイト、文字のタイプポインタが1バイト、メモリ内のバイトは、上記組合と同様にサイズのために傍受することができるたびに、によって相殺される。判断を
int Check_sys()
{
int a = 1;
char* p = (char*)&a;
return *p; //大端返回0,小端返回1
}
int main()
{
int ret = Check_sys();
if (1 == ret)
{
printf("当前模式为小端存储\n");
}
else
{
printf("当前模式为大端存储\n");
}
return 0;
}
試験結果: