我不知道如何在没有警告的情况下将浮点变量转换为整数。由于我的项目中使用的是旧编译器,我没有 std::round,对于这种常见情况,使用 #pragma 禁用警告是一个坏主意。我收到以下警告:
警告 4 警告 C4244:“初始化”:从“float”转换为“size_t”,可能会丢失数据
最佳答案
由于 size_t
必须 是 无符号
类型,因此您首先需要显式检查您的 float
是否为负数:将小于或等于 -1 的 float
转换为 unsigned
类型的行为是未定义。
您需要做的第二项工作是检查float
是否在size_t
的上限范围内。同样,尝试将 float
转换为超出范围的 unsigned
类型的行为是未定义。许多人认为环绕行为适用。如果原始类型是浮点则不会。
只有那么您才应该尝试转换。
最好的办法是使用round()
并使用C风格的转换来转换结果。忽略此时的任何警告。如果使用显式 static_cast
,许多 C++ 编译器会发出较少的警告。如果这会导致警告消失,您可以使用它。
如果 round()
不可用,请考虑使用第三方数学库。推出您自己的版本很诱人,但构建这些函数并不容易,您可能会无意中放弃可移植性(当然,标准库函数是允许这样做的)。请参阅Why does Math.round(0.49999999999999994) return 1?其中涉及一些细节。
这些规则适用于 C 和 C++。
关于c++ - 如何在没有警告的情况下将 float 转换为 size_t,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53985716/