这个问题可能会被问到,但是我搜索过,找不到答案。
我正在实施一个玩具虚拟机,其中OpCodes采用以下形式:
std::tuple<int8_t, int64_t, int64_t> // instruction op1, op2
我正在尝试将一个double打包到其中一个操作数中,并在处理它时再次将其读回。这不能可靠地运作。
double d = ...
auto a = static_cast<int64_t>(d);
auto b = static_cast<double>(a)
// sometimes, b != d
有没有办法将double的位表示打包成int64_t,然后再读取该位模式得到与之前完全相同的双精度?
答案 0 :(得分:5)
static_cast
执行值转换 - 小数部分始终丢失。 memcpy
就是你所追求的。
double d = ...
int64_t a;
memcpy(&a, &d, sizeof(a));
double d2;
memcpy(&d2, &a, sizeof(d2));
尽管如此,我可能会将操作数改为union
,其中包含double
和int64_t
(以及可能对您的VM感兴趣的其他类型)。
答案 1 :(得分:1)
使其工作的一种方法是将内存块重新解释为int64_t / double,即执行指针转换:
double d = ...
auto *a = (int64_t*)&d;
auto *d2 = (double*)a;
auto b = *d2;
assert(d == b);
请注意,我们在此假设double
和int64_t
具有相同的大小(64位)。如果它是标准的一部分,我现在不记得了。