[英]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
解释:
那是值为10
的double
的内部表示。
通过将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.