c++ - 如何在没有警告的情况下将 float 转换为 size_t

标签 c++ c

我不知道如何在没有警告的情况下将浮点变量转换为整数。由于我的项目中使用的是旧编译器,我没有 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/

相关文章:

c++ - C 和 C++ 中的宏定义

c - 这是什么原因? (研究段错误的原因)

c - 如何分析 C 程序的内存使用情况

c++ - 将 fpos_t 转换为 int 或 char

c++ - 类型的 constexpr 检查

c++ - 使用sqlite3时内存不足

c++ - C2977 : 'std::tuple' : too many template arguments (MSVC11)

C++:std::copy esque函数,用于将一个 vector 的值映射到另一个 vector

c - 如何将 char* 中的内容逐个符号复制到 char** 中?

c - 在 C 中存储大量数字