考虑:
#include
#include
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(d);
然后,您可以将该值存储在正确类型的对象中:
float f = static_cast(d);
float * fp = &f;