向int64_t投掷双倍,而不会丢失信息
Cast double to int64_t and back without info lost
这个问题可能已经被问过了,但我搜索了一下,找不到答案。
我正在实现一个玩具虚拟机,其中操作码的形式为:
std::tuple<int8_t, int64_t, int64_t> // instruction op1, op2
我正在尝试将双精度打包到其中一个操作数中,并在处理它时再次读取它。这不能可靠地工作。
double d = ...
auto a = static_cast<int64_t>(d);
auto b = static_cast<double>(a)
// sometimes, b != d
有没有办法将双精度的位表示打包到int64_t中,然后读回该位模式以获得与以前完全相同的双精度?
static_cast
执行值转换 - 小数部分总是丢失。 memcpy
就是你所追求的。
double d = ...
int64_t a;
memcpy(&a, &d, sizeof(a));
double d2;
memcpy(&d2, &a, sizeof(d2));
不过,我可能会将操作数设置为具有double
和int64_t
的union
(可能还有对 VM 感兴趣的其他类型(。
使其工作的一种方法是将内存块重新解释为 int64_t/double,即执行指针强制转换:
double d = ...
auto *a = (int64_t*)&d;
auto *d2 = (double*)a;
auto b = *d2;
assert(d == b);
请注意,我们在这里都假设double
和int64_t
的大小相同(64 位(。我现在不记得它是否是标准的一部分。
相关文章:
- 从不同线程使用int64的不同字节安全吗
- 正在查找文档以获得PS4平台的C++中的设备信息
- 为什么在运行时没有向我们提供有关分段错误的更多信息?
- 奇怪的(对我来说)返回声明 - 在谷歌上找不到任何关于它的信息
- 如何设置一个范围来提取我想要获得的信息
- 系统参数信息A 与 SPI_GETMOUSE 返回 0
- 为什么 gcovr 会生成空覆盖率统计信息?
- 我已经阅读了很多关于 2d 数组的信息,但我在作业中使用它时遇到了麻烦
- 将信息输入到下面显示的结构向量中的正确语法/格式是什么
- 调试符号中缺少 QObject 类信息(编辑但存在其他 Qt 类)
- 为什么数组大小信息可用于"sizeof"运算符和 delete[] 运算符,但在将数组作为参数传递到
- Pisarze - 来自波兰奥林匹克信息学的数据分析任务
- 将数组信息存储到 c++ 向量中有一个"Access violation reading location"
- C++20 个模块在 clang (Windows):在最简单的示例中键入信息错误
- C++ 如何暂停控制台输出,以便用户可以在继续之前阅读信息
- 如何从WebAssembly模块检测浏览器信息?
- Visual Studio 2017 C++,不能使用 typeid() 获取信息对象,缺少指针?;
- 如何实现具有多个平台__FILE__和__LINE__信息的 C/C++ 可变参数日志记录宏?
- 按字母顺序打印存储在字符数组中的信息
- std::extent 实现详细信息说明