【问题标题】:Reinterpret bit pattern type cast in C [duplicate]重新解释 C 中的位模式类型转换 [重复]
【发布时间】: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


【解决方案1】:

在 C 中执行此操作的标准方法是

long y = *(long*)&x;

这与你所做的类似,但你把它放在了大约 8 行中。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-15
  • 1970-01-01
  • 2021-08-31
  • 2011-03-17
  • 2011-01-21
  • 1970-01-01
相关资源
最近更新 更多