私は現在、小さなコンパイラを構築するプロジェクトに取り組んでいます。
私は非常に単純な仮想マシンをターゲットに構築するというアプローチをとることに決めたので、elf や intel アセンブリなどの詳細を学ぶことについて心配する必要はありません。
私の質問は、共用体を使用した C での型のしゃれについてです。VM のメモリでは 32 ビット整数と 32 ビット浮動小数点値のみをサポートすることにしました。これを容易にするために、vm の「メイン メモリ」は次のように設定されます。
typedef union
{
int i;
float f;
}word;
memory = (word *)malloc(mem_size * sizeof(word));
そのため、メモリ セクションを命令に応じて int または float として扱うことができます。
これは技術的にタイプのパニングですか?int をメモリの単語として使用し、float* を使用してそれらを float のように扱うとしたら、確かにそうなるでしょう。私の現在のアプローチは、構文的には異なりますが、意味的には異なるとは思いません。結局、私はまだメモリ内の 32 ビットを int または float として扱っています。
私がオンラインで思いついた唯一の情報は、これが実装に依存していることを示唆しています。大量のスペースを無駄にすることなく、これを達成するためのよりポータブルな方法はありますか?
私は次のことを行うことができましたが、その場合、共用体に関して 2 倍以上のメモリを消費し、「車輪の再発明」を行うことになります。
typedef struct
{
int i;
float f;
char is_int;
}
編集
私はおそらく私の正確な質問を明確にしませんでした。未定義の動作なしで、共用体から float または int のいずれかを使用できることを認識しています。私が求めているのは、具体的には、最後に設定された値が何であるかを知らなくても、int または float として安全に使用できる 32 ビットのメモリ位置を持つ方法です。他のタイプが使用されている状況を説明したいと思います。