2

システムのエンディアンを判断するコードを検索しようとしましたが、これが見つかりました。

int main()
{
    unsigned int i= 1;
    char *c = (char *)&i;
    if (*c) {
        printf("Little Endian\n");
    } else {
        printf("Big Endian\n");
    }
}

このコードがどのように機能するか教えてもらえますか? より具体的には、この型キャストでアンパサンドが必要な理由は次のとおりです。

char *c = (char *)&i;

ポインター c.. に格納されるのは何ですか? i が含む値または i が含まれる実際のアドレスは? また、なぜこれはこのプログラムの char なのですか?

4

2 に答える 2

10

文字ポインターを逆参照している間は、1 バイトのみが解釈されます (char変数が 1 バイトを取ると仮定します)。little-endianモードでleast-significant-byteは、整数の が最初に格納されます。したがって、4 バイト整数の場合、たとえば 3 として格納されます。

00000011 00000000  00000000  00000000

モードの場合、次のbig-endianように保存されます。

00000000  00000000  00000000  00000011

したがって、最初のケースでは、char* は最初のバイトを解釈して表示します3が、2 番目のケースでは を表示します0

次のように型キャストしなかった場合:

char *c = (char *)&i;

互換性のないポインター型に関する警告が表示cされます。4 バイトすべてが解釈されるため、逆参照すると、エンディアンに関係なくinteger pointer整数値が取得されます。3

: 全体像を表示するには、変数を初期化する必要がありiます。それ以外の場合、デフォルトでガベージ値が変数に格納されます。

警告!!OP、私たちは と の違いについて議論しましたが、little-endianとの違いをbig-endian知ることはもっと重要です.私はあなたが後者を使用していることに気付きました.まあ、違いは、Googleでの夢の仕事やベンチャーキャピタルで300万ドルを犠牲にする可能性があることです.あなたのインタビュアーは:-)little-endianlittle-indianlittle-indianNikesh Arora,Sundar Pichai,Vinod Dham or Vinod Khosla

于 2013-04-26T03:04:34.953 に答える