在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 类型并返回结果。