【发布时间】:2016-07-01 06:03:54
【问题描述】:
初始情况/任务
我想将 double-precision 浮点数重新解释为 long 整数。这两种数据类型的字节大小在我的平台上是相等的(即 8 个字节)。我不想触及位模式,即保持模式并将模式视为其他数据类型非常重要。
到目前为止我所尝试的
我做了以下事情:
/* Cast the data to an integral type [long], so floats and doubles can be read as well */
double double_val;
double* double_ptr;
long* long_ptr;
long long_val;
double_val = out1[it]; //23.5f;
double_ptr = &double_val; // set address of new memory location with double-precision number
long_ptr = (long*)double_ptr; // cast float pointer to uint64_t pointer
long_val = *long_ptr;
问题
C++ 有reinterpret_cast。我的代码执行相同的操作吗?
我所做的是转换指针,但我使用两个内存位置。有没有更短、更方便的方法来完成我想要的?
我的代码有任何潜在的副作用吗?
“你为什么要这样做?”
我不得不欺骗我的自动调试脚本。调试 API 只能读取整型变量(long 值)。
另一个原因是我想print 该变量的内存位置的位模式。对于整数类型,这可以使用格式说明符0x%08X 来完成。我不确定这是否也适用于具有double 类型变量的内存位置,或者这是否是特定于实现的或会导致任何其他副作用。
【问题讨论】:
-
“两种数据类型的字节大小在我的平台上是相等的” - 对齐和使用位怎么样?你为什么要讨论
long,却使用uint64_t? -
你检查代码了吗?您的编译器真的使用指针和内存位置吗?
-
要打印 any 对象的表示,请考虑this
-
标准没有要求使用 IEEE 浮点数。如果我的意思是字节序,我写的是(我预计你知道的)而不是“对齐”。使用带有
union的典型模式。
标签: c