从"双精度"转换为"int"时的警告
Warning when converting to `int' from `double'
如何让返回类型作为此表达式的双精度返回: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 常用算术转换
.......
否则,将对两个操作数执行整数提升。然后,以下规则将应用于升级的操作数:
-
如果两个操作数具有相同的类型,则无需进一步转换。
否则,如果两个操作数都具有有符号整数类型 或都具有无符号整数类型,则整数转换秩较小的操作数将转换为秩较大的操作数的类型。
所以,在表达中——
2 * NUM + z;
NUM
是const int
型,与double
z
类型相比,排名较低。根据规则,int
被提升为double
。2 个双精度类型操作数的结果将产生类型 double
的结果。但是您正在将结果分配给int
类型,因此发出警告。将a
类型更改为双精度应该可以正常工作。
相关文章:
- 将无符号转换为复杂<int>原因符号转换警告
- 如何解决隐式转换丢失整数精度:'size_t'(又名"无符号长")到'int'警告?
- MSVC 中从 _Ty 警告到 int 警告的转换累积
- 警告级别为 3 的 int 的 std::vector push_back 处的编译器警告
- 从 int 中剥离位时,编译器会警告一个转换,但不警告其他转换.有解决方法吗?
- 与 string.size() 比较时 int 的符号性显示警告
- 警告C4018,包含int和UINT32,但不包含int和UCHAR
- C++语法错误,编译器不会警告或 int v = func(&v) 出错;
- isspace 函数的性能警告,从 int 转换为布尔值
- 隐式转换警告 int 到 int-looklike
- 从 int 到 longlong 的危险转换:没有警告
- 移植到 64 位时如何避免size_t int 强制转换警告?
- 为什么编译器不断警告我从“int”缩小到“uint8”
- G 警告:从INT转换为UINT16_T可能会改变其值
- 警告从"双精度"转换为"int"
- 消除"conversion to std::vector<int>::size_type to int"警告
- 如何处理警告:从较小的整数类型int转换为int*
- 为什么Visual Studio在自我分配时不触发警告(int foo = foo;)
- 如何获取视觉C++警告 int 到字符串的静默转换
- 警告:'int main(int, char***)' 的第二个参数应该是 'char **' [-Wmain]