重新解释在C中转换的位模式类型 初始情况/任务

重新解释在C中转换的位模式类型 初始情况/任务,c,C,我想将双精度浮点数重新解释为一个长整数。在我的平台上,两种数据类型的字节大小相等,即8字节。我不想接触位模式,也就是说,保持模式并将其视为其他数据类型是很重要的 到目前为止我都试过了 我已经做了以下工作: /* Cast the data to an integral type [long], so floats and doubles can be read as well */ double double_val; double* double_ptr; l

我想将双精度浮点数重新解释为一个长整数。在我的平台上,两种数据类型的字节大小相等,即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++具有重新解释的能力。我的代码是否执行相同的操作

我所做的是投射指针,但我使用两个内存位置。有没有一种更短、更方便的方法来完成我想要的

我的代码有任何潜在的副作用吗

你为什么要这么做? 我必须欺骗我的自动调试脚本。调试API只能读取整型长值变量


另一个原因是我想在变量的内存位置打印位模式。对于整型,这可以使用格式说明符0x%08X完成。我不确定这是否也适用于具有double类型变量的内存位置,或者这是否是特定于实现的,或者是否会导致任何其他副作用。

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

long y = *(long*)&x;

这与您所做的类似,但您将其放在约8行中。

在我的平台上,这两种数据类型的字节大小是相同的-对齐和使用的位如何?为什么你要用uint64\t来谈论长时间的问题?它不类似于:?你检查代码了吗?您的编译器真的使用指针和内存位置吗?打印任何对象的表示,考虑到标准没有使用IEEE浮标的要求。如果我指的是endianess,我写的是我期望你们知道而不是对齐。将典型模式与联合一起使用。它违反了别名规则,并且不是CHe中违反别名规则的标准方式。整个问题是如何违反别名规则。是的,这是C中实现这一点的标准方法:。因为C99的标准方式是通过一个联合体