0

我知道将整数转换为浮点数(反之亦然)相当昂贵。但是,编译器是否会在编译时自动为代码中的常量执行此操作?例如,两者之间有什么区别吗?

float y = 123;
float x = 1 / y;

float y = 123.f;
float x = 1.f / y;

我看到一些执行后者的代码,但我不确定它是出于优化还是安全问题(即,即使 y 恰好是 int,也要确保除法是浮点数)。

我正在使用 gcc(因为答案可能是特定于编译器的。)

此外,任何指向编译器通常可以优化和不能优化的列表的指针都会受到赞赏。谢谢!

4

4 回答 4

2

是的,编译器会自动进行转换。您的两个代码块是相同的。

这不是优化。关闭优化不会使编译器在可执行代码中包含整数到浮点数的转换,除非它是一个质量很差的实现。

这也不是为了安全。编译器从不做任何事情“以防万一”操作数碰巧属于不同的类型。编译器知道代码中所有内容的类型。如果您更改变量的类型,则无论如何都会重新编译使用该变量的所有内容;编译器不会尝试保持其他所有内容不变,而只是更新更改的部分。

于 2009-09-14T06:36:08.670 回答
0

在某些情况下,编译器会将 float 转换为 int,例如

float f;
if (f > 1) ...

在这种情况下,我遇到了(Visual Studio 2008)编译器生成的代码相当于

if (int (f) > 1) ...
于 2009-09-14T11:59:43.900 回答
0

对于大多数编译器来说, float y=123float y = 123.f的情况应该是相同的,但是如果 y 是整数, float x=1/yfloat x=1.f/y实际上会产生不同的结果。

它确实取决于编译器 - 有些可能实际上存储一个常量 int 并在每次将它分配给一个浮点变量时对其进行转换。

于 2009-09-14T06:40:12.047 回答
0

是的,它确实如此,所以这两个片段是等价的。唯一重要的是您分配给的变量的类型。

于 2009-09-14T06:35:47.893 回答