【问题标题】:Convert int64_t to double将 int64_t 转换为双精度
【发布时间】:2010-10-16 01:41:16
【问题描述】:
  int64_t a = 1234;

  double d = (double) a;

这是推荐的方式吗?

【问题讨论】:

  • int64 并不总是能很好地映射到 double。例如比较 double 的最大值和 int64 的最大值。另请注意, double 具有 57 位整数,高于您跳过一些无法以 double 格式表示的整数。而 int64 有 64 位整数,都与它们的邻居相邻 1。它们是非常不同的数字范围。

标签: c++ type-conversion


【解决方案1】:

使用static_cast 作为更奇怪的答案。我建议反对使用隐式转换(甚至是 C++ 源代码中的 C 风格转换),原因如下:

  • 隐式转换是编译器警告的常见来源,这意味着您可能会在构建中添加噪音(现在或稍后添加更好的警告标志时)。
  • 您身后的下一位维护程序员将看到一个隐式转换,并且需要知道这是故意行为还是错误/错误。拥有 static_cast 会让你的意图立即显而易见。
  • static_cast 和其他 C++ 风格的转换很容易被 grep 处理。

【讨论】:

  • 关于“intent”:特别是当赋值远离 d 的声明时,static_cast 违反了 DRY。 d = static_cast(a) 在这方面更好,但后来我失去了生存的意愿,并且认为也许 d = a 毕竟会更好;-)
  • 你是对的,它违反了 DRY ......但如果你考虑前向声明,C++ 作为一种语言无论如何都不是 DRY。此外,IIRC、typeof(d) 需要 RTTI 和 ,这在某些环境中不可用。
  • ......虽然你是对的......如果有人进行不完整的重构,DRY 违规会导致一些奇怪的代码。浮动d; d = static_cast(值); // WTF
【解决方案2】:

您应该使用static_cast 或改用隐式转换:

int64_t a = 1234;
double d = static_cast<double>(a);
double f = a;

【讨论】:

    【解决方案3】:

    对于 POD 类型,两个版本都做同样的事情。选择您喜欢的并保持一致。

    我知道很多人更喜欢前者的打字/可读性,我倾向于同意这一点,但我可以接受。

    我多次听到“易于 grep for”的论点,但从未遇到过需要 grep 代码库以进行 POD 转换的情况。

    【讨论】:

      【解决方案4】:

      你也可以使用转换语法,相当于一个static_cast:

      int64_t a = 1234;
      double d = double(a);
      

      这是一种有用的句法构造,因为它允许在模板代码中以相同的方式处理基元和类类型,或者为基元执行 static_cast,或者为类类型调用构造函数。

      【讨论】:

        猜你喜欢
        • 2015-09-13
        • 2012-09-23
        • 2021-09-12
        • 2019-02-24
        • 2011-07-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-08-11
        相关资源
        最近更新 更多