C ++双指针数组浮点转换

时间:2018-06-04 13:45:01

标签: c++ c++11 type-conversion implicit-conversion

在c ++中将double转换为float的正确方法是什么。转换是隐含的吗?

问题1:考虑double d = 5.0;float f;

哪一个是正确的?

  • f = d;
  • f = (float)d;
  • f = static_cast<float>(d);

问题2:现在考虑我们

char *buffer = readAllBuffer(); 
double *d = (double*)(buffer + offset);
float f;

现在哪一个是正确的?

  • f = d[0];
  • f = (float)d[0];
  • f = static_cast<float>(d[0]);

提前致谢!

2 个答案:

答案 0 :(得分:6)

他们都归结为同样的事情,数组的使用是一个红色的鲱鱼。你确实可以写

float f = d;

有些人认为static_cast使代码更具可读性,因为它非常清晰。如果使用不太冗长的形式,它也可以打败某些编译器可能发出的警告。

当然,因为doublefloat的超集,所以你可能会失去精确度。最后,请注意

float f1 = whatever;
double d1 = f1;
float f2 = d1;

,C ++标准坚持f1f2必须是相同的值。

答案 1 :(得分:0)

你确实有一个主要问题。这是不允许的:

double *d = (double*)(buffer + offset);

它违反了严格的别名和很可能的对齐要求。相反,您需要使用memcpy

double d;
memcpy(&d, buffer + offset, sizeof d);
float f = d;

任何一个强制替换都可以替换最后一行,重要的更改是从解除引用具有错误类型和对齐的指针到进行逐字节复制。