从"双精度"转换为"int"时的警告

Warning when converting to `int' from `double'

本文关键字:警告 int 双精度 转换      更新时间:2023-10-16

如何让返回类型作为此表达式的双精度返回:a = 2 * NUM + z;

这是我的完整程序:

#include <iostream>
using namespace std;
int main()
{
const int NUM = 10;
const double x = 20.5;
int a, b;
double z;
char grade;
a = 25;
cout <<"a = " <<a <<endl;
cout <<" Enter two integers : ";
cin >> a >> b;
cout << endl;
cout << " The numbers you entered are "
     <<a <<" and " <<b <<endl;
      z = x + 2 * a - b;
      cout <<"z = " <<z <<endl;
      grade = 'A';
      cout <<"Your grade is " <<grade <<endl;
      a = 2 * NUM + z;
      cout << "The value of a = " << a <<endl;
      return 0;
}

只需将a声明为double而不是int即可。

double a; 
int b;
// ...

您已经将a定义为int,因此它无法保存double值。如果将定义更改为double a;它应该可以正常工作。

您的z是一个double,所以2 * NUM + z也是一个double,但您将值分配给a这是一个int。我真的不是你想在这里做的事情;如果您尝试将2 * NUM + z的值存储在带有截断a中,那么您应该添加一个 cast: a = static_cast<int>(2 * NUM + z); OTOH,如果您不想截断但想要存储完整的double值,那么您需要将其存储在 double 变量中。

从标准, 6.3.1.8 常用算术转换

.......

否则,将对两个操作数执行整数提升。然后,以下规则将应用于升级的操作数:

  1. 如果两个操作数具有相同的类型,则无需进一步转换。

  2. 否则,如果两个操作数都具有有符号整数类型
  3. 或都具有无符号整数类型,则整数转换秩较小的操作数将转换为秩较大的操作数的类型

所以,在表达中——

2 * NUM + z;

NUMconst int型,与double z类型相比,排名较低。根据规则,int被提升为double。2 个双精度类型操作数的结果将产生类型 double 的结果。但是您正在将结果分配给int类型,因此发出警告。将a类型更改为双精度应该可以正常工作。