C++双指针数组到浮点数的转换
C++ double pointer array to float 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]);
提前致谢!
它们都归结为同一件事,数组的使用是一个转移注意力的问题。你确实可以写
float f = d;
有些人认为 static_cast
使代码更加可读,因为它非常清晰。如果使用不那么长篇大论的形式,它还可以消除某些编译器可能发出的警告。
当然,因为 double
是 float
的超集,您可能会失去精度。最后,请注意 for
float f1 = whatever;
double d1 = f1;
float f2 = d1;
,C++标准坚持f1
和f2
必须是相同的值。
你确实有一个主要问题。这是不允许的:
double *d = (double*)(buffer + offset);
它违反了严格的别名和很可能的对齐要求。相反,您需要使用 memcpy
:
double d;
memcpy(&d, buffer + offset, sizeof d);
float f = d;
任何一个转换选项都可以替换最后一行,重要的变化是从取消引用类型和对齐不正确的指针到制作按字节复制。
在 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]);
提前致谢!
它们都归结为同一件事,数组的使用是一个转移注意力的问题。你确实可以写
float f = d;
有些人认为 static_cast
使代码更加可读,因为它非常清晰。如果使用不那么长篇大论的形式,它还可以消除某些编译器可能发出的警告。
当然,因为 double
是 float
的超集,您可能会失去精度。最后,请注意 for
float f1 = whatever;
double d1 = f1;
float f2 = d1;
,C++标准坚持f1
和f2
必须是相同的值。
你确实有一个主要问题。这是不允许的:
double *d = (double*)(buffer + offset);
它违反了严格的别名和很可能的对齐要求。相反,您需要使用 memcpy
:
double d;
memcpy(&d, buffer + offset, sizeof d);
float f = d;
任何一个转换选项都可以替换最后一行,重要的变化是从取消引用类型和对齐不正确的指针到制作按字节复制。