現在のストレージ環境を確認する方法ビッグエンディアンかリトルエンディアンのですか?

まず、画像メモリグリッド。
1、我々のデータはメモリに保存されているが、それは1が行う正確に何を保存されていることをすべて知っていますか?ここでは、格納されたデータを視覚化する「メモリチェック」を導入します。32ビットコンピュータでは、バイトのグリッドを表すと仮定すると、4バイトのセルは、そのようなことです。

0000 0000 0000 0000 0000 0000 0000 0000

丁度良い8ビットバイト、4×4バイトグリッドは32であり、32ビットマシンにintは4バイトである理由、これは、とINTは、ビットの現在の数に基づいて、整数です。 64ビットのintタイプは8バイトである場合にマシンがあります。

第二に、メモリ格子アドレス。
1、それを読み込む方法です?各グリッドに8ビットがあり、グリッドを表すためにバイトである以上述べてきたが、我々はデータグリッドを読みたいとき その答えは、アドレスによってアドレス指定され、CPUはアドレスがローからハイに左から右にあり、各グリッドのためのメモリアドレスが割り当てられます。店舗バイトのデータ型ならば、我々は唯一のグリッドに取り組む必要があります。変数は、4バイトのデータがそれを必要ですか?これは、最後の4つの格子のアドレスがどのアドレスにアクセスで占めていますか?答えはまた、最初のアドレスとして知られているグリッドの先頭のアドレスを、4つのグリッドです。したがって、32ビットマシンは、INT定義され[10]、[0]は4つのバイトを占めているので[0]アドレスと[1]のアドレスは、差が、4の違いはないでしょう、最初のアドレスいずれかである、[1]は、第一のアドレス方、4つのバイトを占め、4だけ差が良好です。

第三に、ターミナルモードの大きさ。
図1に示すように、小端モード:下部格子の上側又は下側メモリアドレスにおける進数のメモリ格子グリッドにおける高いアドレスは、それがリトルエンディアンと呼ばれています。

図2に示すように、ビッグエンディアンモード:小モードの反対側の端部が、データが低いメモリ・アドレスの上位グリッド上に配置され、データは、より低い配置又は高いメモリアドレスの格子れます。

3、どのようにそれを理解するには?たとえば、次の32ビットマシン、バイナリ1ならば、それは(我々が書き出すれる)1 INT A = 0,000,000,000,000,001であり、それは、コンピュータ記憶時にこのようである必要はなく、2つの可能性があります次のように:

0000 0000 0000 0000 0000 0000 0000 0001
1000 0000 0000 0000 0000 0000 0000 0000

だから、私たちは二つの方法でこれを参照して、第一の方法は、最初のリトルエンディアンモードで保存されているので、2進数の1が(ある、低グリッドアドレス)第1グリッド上の低い格納することです。第二を見て、2進数の1が最後のグリッド(すなわち格子高アドレス)で、第二は、ビッグエンディアンのメモリで低いです。

第四に、どのように現在のストレージ環境は、ビッグエンディアンかリトルエンディアンモードがされて決定するために?

図1に示すように、本体を判定するための一般的な方法を使用して。

#include <stdio.h>
union test
{
    int a; 
    char b;
};
int main(void)
{
    union test t1;
    t1.a = 1;
    if(t1.b == 1)
    {
        printf("小端模式\n");
    }
    else
    {
        printf("大端模式\n");
    }
    return 0;
}

コードについて考えを試験する:共通ボディの定義は、同じメモリを共有するすべての変数の集合であり、int型A = 1は、ストレージ1は二つの明らかに基づいてもよい場合。

0000 0000 0000 0000 0000 0000 0000 0001
1000 0000 0000 0000 0000 0000 0000 0000

char型Bはメモリと共有され、Bはバイトの長さであり、それはコンテンツ内の第1の格子Bである必要があり、次に、それはエンドbで決定される格子の0又は1当量が決定されますアドレスグリッド格子またはアドレスの最上位ビットに格納され、それはビッグエンディアンまたはリトルエンディアンモードを判定することができる最下位ビットの最下位ビットを得ることができ、0又は1です。

図2に示すように、メソッドポインタを使用して決定されます。

#include <stdio.h>
int main(void)
{
    int a = 1;  
    char *pa = (char*)(&a);
    if((*pa) == 1)
    {
        printf("小端模式\n");
    }
    else
    {
        printf("大端模式\n");
    }
    return 0;
}

コード検査はおそらく考えている:上記の原則と同様に、最初のint A = 1に定義し、次に、このメモリにアクセスするためのcharポインタを入力し、文字へのポインタは確かに、第1グリッドを読み取るために使用されます説明が低い低いアドレス上にある場合は、それはそれ以外の場合には、ビッグエンディアンモードで、リトルエンディアンです。

図3に示すように、いくつかの一見テストモード端子のサイズではなく、実際の方法:
(1)位置、又は位置

    int a = 1;
    int b;
    b = a & 0x01;       // 判断是1还是0来判断

理由:&0x01のは、メモリはメモリの&直接ではなく、上のレベルから読み出されたとき、それは望ましいことではありません。

(2)置換

    int a = 1;
    int b;
    b = a>>1;           // 通过右移得出是1还是0判断

理由:>> 1市を実行するとき、それは望ましいことではないので、メモリからの読み出しは、直接メモリレベルで>>アウト代わりにすでにあります。

(3)キャスト

    int a = 1;
    char b;
    b = (char)a;        // 通过强制类型转换得出是1还是0判断

理由:その後、上記のように、キャストの時間の間に、どのような数のメモリからの読み出し、および無意味であるキャスト、。

V.まとめ。
1、我々は、メモリ階層内で直接動作レベルC言語は、操作のレベルに属している場合ではない全ての方法は、端末モードの大きさを確認することができることを見出し、我々はメモリにこの番号で開始する必要が読み取り操作ではなくそのような方法は使用できません。

このデータの労働組合は、メモリから読み出されるよう2は、ポインタと同じように、今はそれが代わりに運転を読み出し、その後どのようなモード、そして知ることができます。

公開された24元の記事 ウォン称賛27 ビュー10000 +

おすすめ

転載: blog.csdn.net/gyyu32g/article/details/79097169