C言語_サイズ端子とunion


大端(big_endian):ワードデータの高バイトは低アドレスに格納され、ワードデータの低バイトは高アドレスに格納される.
リトルエンド(little_endian):ワードデータの高バイトは高アドレスに格納され、ワードデータの低バイトは低バイトに格納される.
一方,union型メンバへのアクセスは,その連合体ベースアドレスに対するオフセット量が0で始まる,すなわち連合体へのアクセスはどの変数へのアクセスもunionのヘッダアドレス位置から始まる.
この特性を用いて,現在のシステムが大端であるか小端であるかを判断できる.
#include <stdio.h>

union AA
{
        int i;
        char a[2];
};

int is_little_endian()
{
        union check
        {
                int i;
                char ch;
        }c;
        c.i = 1;

        return (c.ch == 1);
}

int main()
{
        int ret;
        union AA *p, u;
        p = &u;

        memset(&u, 0, sizeof(union AA));
        p->a[0] = 0x39;
        p->a[1] = 0x38;

        printf("0x%x
", p->i); if(is_little_endian()){ printf("little endian!
"); } else{ printf("big endian!
"); } return 0; }
test@test:~/tmp/cbase$ gcc union.c 
test@test:~/tmp/cbase$ ./a.out 
0x3839
little endian!