在ARM上,当双精度浮点数转换为int64_t类型时,如果结果溢出,则会发生未定义行为。为了避免这种情况,可以使用以下示例代码中的函数,将双精度浮点数转换为int64_t类型之前,先进行范围检查。
#include
#include
int64_t safe_double_to_int64_t(double d)
{
if (d > std::numeric_limits::max() || d < std::numeric_limits::min() || std::isnan(d)) {
throw std::out_of_range("double to int64_t conversion out of range");
}
return static_cast(d);
}
在上述代码中,我们使用了 std::numeric_limits
头文件中的 max
和 min
函数来获得 int64_t
类型的最大值和最小值。如果要转换的双精度浮点数超出了这两个值之间的范围,或者为 NaN
(不是数字),则会抛出 std::out_of_range
异常。如果无异常抛出,则使用 static_cast
将双精度浮点数转换为 int64_t
类型并返回结果。