7

重複の可能性:
Little vs Big Endianess: テストの解釈方法

gcc またはビッグ エンディアンの ideone のようなオンライン コンパイラでコードをテストする簡単な方法はありますか? qemu や仮想マシンを使いたくない

編集

誰かがビッグエンディアンを使用するシステムでのこのコードの動作を説明できますか?

#include <stdio.h>
#include <string.h>
#include <stdint.h>

int main (void)
{
    int32_t i;
    unsigned char u[4] = {'a', 'b', 'c', 'd'};

    memcpy(&i, u, sizeof(u));
    printf("%d\n", i);
    memcpy(u, &i, sizeof(i));
    for (i = 0; i < 4; i++) {
        printf("%c", u[i]);
    }
    printf("\n");
    return 0;
}
4

1 に答える 1

5

プログラムとして?

#include <stdio.h>
#include <stdint.h>

int main(int argc, char** argv) {
    union {
       uint32_t word;
       uint8_t bytes[4];
    } test_struct;
    test_struct.word = 0x1;
    if (test_struct.bytes[0] != 0)
        printf("little-endian\n");
    else
        printf("big-endian\n");
    return 0;
}

リトルエンディアン アーキテクチャでは、最下位バイトが最初に格納されます。ビッグ エンディアン アーキテクチャでは、最上位バイトが最初に格納されます。したがって、 auint32_tを auint8_t[4]でオーバーレイすることにより、どのバイトが最初に来るかを確認できます。参照: http://en.wikipedia.org/wiki/Big_endian

特に GCC は__BYTE_ORDER__マクロを拡張子として定義します。__ORDER_BIG_ENDIAN____ORDER_LITTLE_ENDIAN__、および__ORDER_PDP_ENDIAN__(存在することを知りませんでした!)に対してテストできます-- http://gcc.gnu.org/onlinedocs/cpp/Common-Predefined-Macros.htmlを参照してください

http://en.wikipedia.org/wiki/Big_endianも参照してください。


マシンのネイティブ エンディアンと一致しないエンディアンでコードを実行する場合は、エンディアンが異なるアーキテクチャでコンパイルして実行する必要があります。そのため、エミュレーターまたは仮想マシンでクロスコンパイルして実行する必要があります。


編集:ああ、私は最初のものを見ませんでしたprintf()

ビッグエンディアンのマシンは文字を int の最上位バイトとして解釈するため、最初のprintfコマンドは "1633837924" を出力します。'a'

の値が との間でバイト単位でコピーされているため、 2 番目printfは単に "abcd" を出力します。ui

于 2013-02-02T09:48:44.837 に答える