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