将double转换为int64_t并返回而不丢失信息

时间:2017-03-18 18:20:26

标签: c++ c++17

这个问题可能会被问到,但是我搜索过,找不到答案。

我正在实施一个玩具虚拟机,其中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,然后再读取该位模式得到与之前完全相同的双精度?

2 个答案:

答案 0 :(得分:5)

static_cast执行值转换 - 小数部分始终丢失。 memcpy就是你所追求的。

double d = ... 
int64_t a;
memcpy(&a, &d, sizeof(a));
double d2;
memcpy(&d2, &a, sizeof(d2));

尽管如此,我可能会将操作数改为union,其中包含doubleint64_t(以及可能对您的VM感兴趣的其他类型)。

答案 1 :(得分:1)

使其工作的一种方法是将内存块重新解释为int64_t / double,即执行指针转换:

double d = ...
auto *a = (int64_t*)&d;
auto *d2 = (double*)a;
auto b = *d2;
assert(d == b);

请注意,我们在此假设doubleint64_t具有相同的大小(64位)。如果它是标准的一部分,我现在不记得了。