在C ++中使用不同的数据类型进行转换

时间:2016-09-27 20:11:33

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

在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;
}

2 个答案:

答案 0 :(得分:2)

声明

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

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

  1. int iNumber除以int 2 - &gt;结果为2
  2. 将结果投射到浮动中 - &gt;导致浮动为2.
  3. 如果您改为:

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

    现在,在演员阵容之前,除法的结果将是2.5的浮动类型,你应该按照预期得到2.5。

    这一切都很好,但是为什么呢

    fNumber = (float) iNumber / 2;
    

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

答案 1 :(得分:-1)

static_cast<float>(expression)期望括号中的表达式,括号中的表达式将决定操作的顺序。

为了有效地将int转换为浮点数而不丢失C ++风格的数据,第三个表达式需要单独用iNumber左右的括号重写,如fNumber = static_cast<float>(iNumber) / 2;所示,以最终打印&#34 ; Number is 2.5&#34;:

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

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