1. ホーム
  2. c

[解決済み] ビッグエンディアン、リトルエンディアンマシンを判定するCマクロの定義?

2022-09-09 01:51:30

質問

エンディアンを判定するための1行マクロ定義はありますか。私は以下のコードを使用していますが、マクロに変換すると長くなりすぎてしまいます。

unsigned char test_endian( void )
{
    int test_var = 1;
    unsigned char *test_endian = (unsigned char*)&test_var;

    return (test_endian[0] == 0);
}

どのように解決するのですか?

任意のバイトオーダーをサポートするコードで、ファイル名 order32.h :

#ifndef ORDER32_H
#define ORDER32_H

#include <limits.h>
#include <stdint.h>

#if CHAR_BIT != 8
#error "unsupported char size"
#endif

enum
{
    O32_LITTLE_ENDIAN = 0x03020100ul,
    O32_BIG_ENDIAN = 0x00010203ul,
    O32_PDP_ENDIAN = 0x01000302ul,      /* DEC PDP-11 (aka ENDIAN_LITTLE_WORD) */
    O32_HONEYWELL_ENDIAN = 0x02030001ul /* Honeywell 316 (aka ENDIAN_BIG_WORD) */
};

static const union { unsigned char bytes[4]; uint32_t value; } o32_host_order =
    { { 0, 1, 2, 3 } };

#define O32_HOST_ORDER (o32_host_order.value)

#endif

リトルエンディアン・システムをチェックするには

O32_HOST_ORDER == O32_LITTLE_ENDIAN