繁体   English   中英

如何将双精度转换为浮动指针?

[英]How to cast double to float pointer?

我正在尝试将 double 转换为浮点指针,但我不知道正确的方法。

这是我的代码

#include <iostream>

int main(int argc, const char * argv[]) {
    // insert code here...


    float *f;
    double d = 10;

    f = reinterpret_cast<float*>(&d);
    d = 20;

    std::cout << "RESULT : " << *f << std::endl;
    return 0;
}

我得到以下结果。

RESULT : 0
Program ended with exit code: 0

如何正确地将 double 转换为浮点指针?

添加:我期望得到的结果是 20

考虑:

#include <cstdio>
#include <cassert>

using namespace std;

int main()
{
    double d = 10;
    float f;
    assert( sizeof d == 8 );
    assert( sizeof f == 4 );

    unsigned char * d_ = (unsigned char *)&d;
    printf( "%hhx %hhx %hhx %hhx %hhx %hhx %hhx %hhx\n", d_[0], d_[1], d_[2], d_[3], d_[4], d_[5], d_[6], d_[7] );
}

至少在我的机器上,这给出了以下输出:

0 0 0 0 0 0 24 40

解释:

那是值为10double的内部表示。

通过将double *float * ,您只查看它的前四个字节 - 0 0 0 0 当您取消引用指针时,您是否明白为什么会得到0输出?

(除此之外,正如其他人所指出的,由于打破了严格的别名,指针的取消引用是未定义的行为。)

解决方法:

您可能想要的是转换d

static_cast<float>(d);

然后,您可以将该值存储在正确类型的对象中:

float f = static_cast<float>(d);
float * fp = &f;

您用于投射指针的代码是正确的。

错误是*f ,它通过违反严格的别名规则导致未定义的行为。 您不能通过指针读取或写入其指向的对象类型错误的指针。 (有一小部分例外情况)。

行为未定义:语言没有提供这样做的方法。 例如, sizeof(float*)不必与sizeof(double*) C++ 旨在最大限度地提高灵活性。

您可以将double的地址转换为const unsigned char*指针并以这种方式读取内存。

否则,您需要求助于汇编,在 CPU 级别,指向类型的指针和整数类型之间的区别相当模糊。

如果要将double转换float ,请编写

double d = 10; float f = d;

您想要做的是缩小static_cast

auto f = static_cast<float>(d);
float* pointer = &f;

使用reinterpret_cast将失败,因为它不会发出编译器将double的按位表示更改为float的按位表示。 从字面上看,它会将 double 值重新解释为浮点数,随着表示形式的不同,会产生奇怪且未定义的结果。 另一边的static_cast会照顾你正确调整表示,如有必要,可能会截断最低有效位。 在此之后,您可以安全地使用浮点变量的地址并使用指针访问该值。

您想要的行为可以在 C++ 中实现。 虽然不是通过原始指针,但 C++ 允许用户定义类型。

class double_as_float {
  double& d;
public:
  double_as_float(double& d) : d(d) { }
  float operator*() const { return static_cast<float>(d); }
};

用法:

#include <iostream>
int main() {

    double d = 10;

    double_as_float f { d };
    d = 20;

    std::cout << "RESULT : " << *f << std::endl;
    return 0;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM