正确修复转换和丢失数据警告?

时间:2010-11-06 22:44:14

标签: c++ casting compiler-warnings

我有一个名为PointF的类,它有一个带Point的构造函数,我不断收到“可能丢失的数据警告”。我如何证明我的意图实际上是将float值转换为int等等?我尝试了static_cast(float)但他们没有修正警告。

例如:

int curPos = ceil(float(newMouseY / font.getLineHeight())) ; //float to int

outputChars[0] = uc; //converting from size_t to char

4 个答案:

答案 0 :(得分:1)

演员应该做的事;这说“明确地将这种类型变成了那种类型”,这对编译器来说通常很愚蠢:

int curPos = static_cast<int>(ceil(float(newMouseY / font.getLineHeight())));

或者:

outputChars[0] = static_cast<char>(uc);

确保您尝试的演员阵容与此类似。你说“我试过...... (float)”这让我相信你尝试过这样的事情:

int curPos = (float)(ceil(float(newMouseY / font.getLineHeight())));

哪个什么都没做。表达式的类型已经是float,将它转换为相同类型的是什么?您需要将其强制转换为目标类型。


请记住,通常应避免使用强制转换。在你的第一个片段中,演员是明智的,因为当你量化某些东西时,你一定需要丢弃信息。

但是你的第二次演员不是。为什么uc首先是size_t?当演员 删除信息时会发生什么?这真的是个好主意吗?

答案 1 :(得分:0)

您需要投放ceil的结果,最好使用static_cast

答案 2 :(得分:0)

您可能必须使用明确的演员表,即

int curPos = int(ceil(...));

答案 3 :(得分:0)

您必须将变量转换为正常的改变她的类型。如果您尝试将size_t转换为char,那么您尝试将4 bytes保存到1 byte,以这种方式丢失数据是正常的。