【问题标题】:Casting between different datatypes in C++C ++中不同数据类型之间的转换
【发布时间】:2016-09-27 20:11:33
【问题描述】:

在 C++ 中处理不同数据类型之间的转换...下面的程序打印:

>"Number is 2"
>"Number is 2.5"
>"Number is 2" 

请解释为什么最后一个打印输出不是“数字为 2.5”,这是我在 C++ 样式转换为浮动之后所期望的?

#include <iostream>
#include <conio.h>
using namespace std;

int main() {

    int iNumber = 5;
    float fNumber;

    // No casting - C++ implicitly converts the result into an int and saves into a float
    // which is a conversion from 'int' to 'float' with possible loss of data
    fNumber = iNumber / 2;
    cout << "Number is " << fNumber << endl;

    // C-style casting not recommended as not type safe
    fNumber = (float) iNumber / 2;
    cout << "Number is " << fNumber << endl;

    // C++ style casting using datatype constructors to make the casting safe
    fNumber = static_cast<float>(iNumber / 2);
    cout << "Number is " << fNumber << endl;

   _getch();

   return 0;
}

【问题讨论】:

  • (iNumber / 2) 变为 2,然后将其转换为浮点数,因此值将是 2。操作顺序。在之前的那个中,您将 iNumber 在除法之前转换为浮点数,这就是它输出 2.5 的原因。

标签: c++ floating-point int implicit-conversion explicit-conversion


【解决方案1】:

声明

fNumber = static_cast<float>(iNumber / 2);

在转换为浮点数之前将整数除以整数。这导致以下步骤:

  1. int iNumber 除以int 2 --> 得到 int 为 2
  2. 将结果转换为浮点数 --> 结果为浮点数 2。

如果你这样做:

fNumber = static_cast<float>(iNumber / 2.0);

现在除法的结果将是转换前的 2.5 的浮点类型,您应该得到预期的 2.5。

这一切都很好,但为什么会这样

fNumber = (float) iNumber / 2;

工作?这是因为您在除法运算之前将 iNumber 转换为浮点数,所以这里再次将浮点数除以整数,结果将是 2.5 的浮点数。

【讨论】:

    【解决方案2】:

    static_cast&lt;float&gt;(expression) 需要括号中的表达式,括号将确定操作的顺序。

    为了有效地将 int 转换为 float 而不会丢失 C++ 样式中的数据,需要将第三个表达式单独重写为 iNumber 周围的括号,就像在 fNumber = static_cast&lt;float&gt;(iNumber) / 2; 中一样,最终打印“Number is 2.5”:

    • iNumber 被强制转换为浮动,
    • 2 隐式转换为 2.0
    • iNumber 除以2.0

    请注意,定义操作顺序的括号在 C 中围绕数据类型,但在 C++ 中围绕变量。

    【讨论】:

      猜你喜欢
      • 2021-08-12
      • 2012-11-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-09
      • 1970-01-01
      相关资源
      最近更新 更多