0

致力于 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;
}
4

2 回答 2

2

该声明

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

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

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

如果您改为:

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

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

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

fNumber = (float) iNumber / 2;

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

于 2016-09-27T20:16:19.440 回答
-1

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

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

  • iNumber被铸造成浮动,
  • 2被隐式转换为2.0and
  • iNumber除以2.0

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

于 2016-09-27T20:36:13.753 回答