数字类型之间的C ++转换

时间:2016-02-18 12:06:00

标签: c++ casting

我知道C ++中的不同的转换操作符已经在这里多次讨论了,但我的问题是关于在 数字类型 之间进行转换,而不是关于一般差异C风格和C ++风格的运算符之间。我认为这是一个完全不同的主题,而不是在类层次结构中进行转换。

假设我想将一个int i转换为double,我有一些选项

static_cast<double>(i)
(double) i
double(i)

在这种情况下,我个人更喜欢第3行中类似构造函数的样式,因为我想表达这不是一个演员类型类型,我当然会使用static_castdynamic_cast

除了在文本编辑器中搜索时难以找到这种类型的演员表,我选择有任何缺点吗?

2 个答案:

答案 0 :(得分:4)

static_cast<double>(i)肯定是你在这种特殊情况下最明确表达的意思。

在数字类型之间进行转换时,您通常会远离未定义的行为。所以一般要小心。虽然为i的每个可能值定义了广告素材,但将double投放到int 可以溢出int,并且该行为是在C ++中未定义。

我总是建议您检查目的地类型是否可以容纳源类型。 std::numeric_limits<>::max()等可以在这里提供帮助。

C ++标准未指定int的最大大小(尽管16,32和64位2的补码是常见的),因此,它可能无法表示为double。< / p>

在我的代码中,我有一个包含

的命名空间
  template<
        typename T/*the desired type*/,
        typename/*the source type*/ Y
    > T integral_cast(const Y& y)
    {
        static_assert(false, "undefined integral_cast");
    }

我专注于我需要的每个数字演员。

答案 1 :(得分:3)

这些方法的一个主要缺点是强制转换不能防止溢出和其他数字错误。

使用static_cast是直接理智的解决方案,静态代码分析工具(如PVS studio)不会标记此方法。 (double)i方法会生成警告。

最安全的方法可能是让你自己的演员说numeric_cast<T>()

template <class OT, class ST>
OT numeric_cast(const ST value)
{
    return static_cast<OT>(value);
}

此函数的优点是您可以执行绑定检查和其他数字检查,以确保强制转换是合法的,并且不会返回(或获取)垃圾值。

还有另一种处理数字的方法,但它只适用于不变的编译时值。对于此检查user defined string literals