我目前正在做一个项目来构建一个小型编译器,只是为了它。
我决定采用构建一个非常简单的虚拟机作为目标的方法,这样我就不必担心学习 elf、intel 汇编等的来龙去脉了。
我的问题是关于在 C 中使用联合的类型双关语。我决定在 vm 的内存中只支持 32 位整数和 32 位浮点值。为方便起见,vm的“主存”设置如下:
typedef union
{
int i;
float f;
}word;
memory = (word *)malloc(mem_size * sizeof(word));
因此,我可以根据指令将内存部分视为 int 或 float。
这是技术上的双关语吗?如果我将整数用作记忆词,然后使用 float* 将它们视为浮点数,那肯定会是这样。我目前的方法虽然在语法上有所不同,但我不认为在语义上有所不同。最后,我仍然将内存中的 32 位视为 int 或 float。
我能在网上找到的唯一信息表明这取决于实现。有没有更便携的方法来实现这一点而不会浪费大量空间?
我可以执行以下操作,但是我将占用 2 倍以上的内存并在工会方面“重新发明轮子”。
typedef struct
{
int i;
float f;
char is_int;
}
编辑
我可能没有把我的确切问题说清楚。我知道我可以使用联合中的浮点数或整数,而不会出现未定义的行为。我所追求的是一种拥有 32 位内存位置的方法,我可以安全地将其用作 int 或 float,而无需知道最后设置的值是什么。我想说明使用其他类型的情况。