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

Des*_*ess 4 c++ c++17

这个问题可能会被问到,但我搜索到了,找不到答案.

我正在实现一个玩具虚拟机,其中OpCodes采用以下形式:

std::tuple<int8_t, int64_t, int64_t> // instruction op1, op2
Run Code Online (Sandbox Code Playgroud)

我正在尝试将一个double打包到其中一个操作数中,并在处理它时再次读回它.这不能可靠地工作.

double d = ...
auto a = static_cast<int64_t>(d);
auto b = static_cast<double>(a)
// sometimes, b != d
Run Code Online (Sandbox Code Playgroud)

有没有办法将double的位表示打包成int64_t,然后读取该位模式返回得到与之前完全相同的双精度数?

Mat*_*lia 5

static_cast执行值转换 - 小数部分总是丢失.memcpy是你所追求的.

double d = ... 
int64_t a;
memcpy(&a, &d, sizeof(a));
double d2;
memcpy(&d2, &a, sizeof(d2));
Run Code Online (Sandbox Code Playgroud)

尽管如此,我可能会改为将操作数设置union为a double和a int64_t(以及其他可能对您的VM感兴趣的类型).

  • @RichardCritten我假设的建议是,如果打算使用`double`参数,那么它将被写入并读作`double`(使用元组的`int8_t`成员来区分) (3认同)
  • 从联合体的任何成员读取(最后写入的成员除外)都是未定义的行为。 (2认同)