c++ - GCC -Wconversion 与否定一起发出警告,但不会发出其他警告

标签 c++ gcc floating-point gcc-warning

拿这段代码:

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。此外,在 ab 不是常量的其他代码中,行为是相同的。

最佳答案

警告是什么意思?

某些 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/

相关文章:

c - 为什么 C 浮点类型在输出时将 125.1 的实际输入修改为 125.099998?

c++ - 段错误和运算符重载

c++ - 为什么 C++ 流将 bool 视为数字?

c++ - OpenGL 3.2 编程指南?

c++ - 我在解释 N4140 的§8.5.3/5 段中的要点 (5.2.1.1) 时遇到了一些困难

linux - 给定两个 Linux 静态库,如何判断一个是否依赖于另一个?

c++ - 将迂腐的 GCC key 应用于 Qt 中的项目时出现很多警告

c++ - g++ 编译器是否以不同方式查看字符串数组和整数数组?

c++ - 给定数字的浮点分辨率

perl - Perl 5.16.3 和 5.8.7 中的 float 精度差异