拿这段代码:
int main()
{
short a = 2, b = 1;
float f = 5.36f;
-a * f;
b * f;
}
编译:
~ $ g++ -std=c++11 wconversion.cpp -Wconversion
wconversion.cpp: In function ‘int main()’:
wconversion.cpp:6:8: warning: conversion to ‘float’ from ‘int’ may alter its value [-Wconversion]
-a * f;
为什么它对 a
发出警告,但对 b
不发出警告?
编辑:因为它似乎取决于编译器版本:我使用的是 GCC 4.9。此外,在 a
和 b
不是常量的其他代码中,行为是相同的。
最佳答案
警告是什么意思?
某些 32 位类型 int
的值不能完全表示为 float
。如果将这样的 int
值转换为 float
,将选择最近的 float
(两个周围 float 之间的选择是实现定义的,但几乎所有的实现都会选择最近的一个)。
警告似乎是关于从 int
或更宽的整数类型到 float
的转换过程中的信息丢失。
智能编译器是否应该对 b
发出警告?
智能编译器不需要为 b
发出警告,因为 b
是一个 short
(大概是 16 位的OP 的体系结构),并且 b
在运行时可能具有的所有值都可以完全表示为 float
。
智能编译器是否应该对 -a
发出警告?
出于同样的原因,聪明的编译器可以避免对 a
发出警告。 -a
由于促销而具有类型 int
,但 -a
的值范围为 -(215- 1) 到 215(在 OP 的平台上)。所有这些值都可以精确地表示为 float 。但是,此处似乎触发的一般警告是针对 int
或更宽类型的表达式。 GCC 似乎无法检测到消息警告的情况不会出现。
关于c++ - GCC -Wconversion 与否定一起发出警告,但不会发出其他警告,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29341661/