Изменение типа переменной с плавающей запятой с float
на double
приводит к исчезновению предупреждения:
$ cat 'file.cpp'
#include <iostream>
int main()
{
int a = 2;
int b = 3;
double f = a / b;
std::cout << f;
}
Компиляция с $ g++-4.7 -Wconversion 'file.cpp'
не возвращает предупреждений (как $ clang++ -Weverything 'file.cpp'
).
Пояснение:
Предупреждение при использовании типа float
не возвращается из-за полностью допустимой целочисленной арифметики, а потому что float
не может хранить все возможные значения int
(большие не могут быть захвачены float
, но double
). Так что может быть изменение значения при назначении RHS f
в случае с плавающей запятой, но не в случае double. Чтобы было понятно: предупреждение возвращается не из-за int/int
, а из-за назначения float = int
.
Для этого см. Следующие вопросы: в чем разница между типом данных с плавающей точкой и целочисленным типом данных, когда размер одинаков в Java , Хранение целых чисел в виде чисел с плавающей запятой и Округление для использования для int -> float -> int конверсия туда и обратно
Тем не менее, при использовании float
-Wconversion
все еще может быть полезно определить возможные линии, которые затронуты, но не являются исчерпывающими и фактически не предназначены для этого. Для -Wconversion
см. docs / gcc / Warning-Options.html и здесь gcc.gnu.org / wiki / NewWconversion
Возможно, интерес представляет также обсуждение ' Неявное приведение вычисления целых чисел для плавания в C ++ '