他の回答に記載されているように、すべてのユニオンメンバーは同じメモリスペースを占有します。メモリは常にベースタイプとして解釈できますが、結果は予期しないことがあります。
私は16進数でいくつかの詳細を印刷するコードを作成しました。連続した値が割り当てられるたびにメモリが変化することがわかります。浮動小数点数が割り当てられたときに倍精度浮動小数点値が完全に変更されないため、出力値は元の値に近くなります。これは、タイプ・サイズとハードウェア・アーキテクチャーの副作用に過ぎません。
なぜなら、coutを使用して16進文字を印刷するのはそんなに苦しいことです。
#include <iomanip>
#include <iostream>
#include <string.h>
union mytypes_t {
unsigned char a[8];
char c;
int i;
float f;
double d;
} mytypes;
int main() {
memset(&mytypes,0,8);
std::cout << "Size of the union is: " << sizeof(mytypes) << std::endl;
mytypes.c = 'z';
for(int i=0;i<8;i++)
printf("%02x ", mytypes.a[i]);
printf("\n");
mytypes.d = 4.13021;
for(int i=0;i<8;i++)
printf("%02x ", mytypes.a[i]);
printf("\n");
mytypes.f = 41.7341;
for(int i=0;i<8;i++)
printf("%02x ",mytypes.a[i]);
printf("\n");
std::cout << mytypes.c << std::endl;
std::cout << mytypes.d << std::endl;
std::cout << mytypes.f << std::endl;
return 0;
}
Size of the union is: 8
7a 00 00 00 00 00 00 00 // The char is one byte
da 72 2e c5 55 85 10 40 // The double is eight bytes
b8 ef 26 42 55 85 10 40 // The float is the left most four bytes
�
4.13021
41.7341
"これはC++です。 :)未定義の動作が発生します。 – GManNickG
ユニオンのアクティブでない部分にアクセスすることは、未定義の動作であることに注意してください。 – NathanOliver
エラーが必要な場合は、 'boost :: variant'のようなバリアント型を使用してください。 – chris