2011-04-10 48 views
1

我不认为大多数编译器都会关心,例如,如果不将f附加到浮点类型的变量上。但仅仅因为我希望尽可能明确和准确,我想表达正确的类型。文字操作数的类型

不同类型的两个文字操作数的结果类型是什么,还是取决于具体情况?例如为:

int i=1.0f/1; 
float f=1.0f/1; 

,编译器将不会在这两个实例抱怨,是不是因为文字类型,或者是由于操作的结果的类型根据上下文总是转换其宽容视图的?

回答

1

第一个用int分隔一个浮点数,它总是导致一个浮点数(就像一个浮点数除以int)。这个浮点结果然后被转换成一个int来存储在i中。

第二个采用操作导致的浮点数,并将其赋值给float变量,以保持浮点数。

这里有两个单独的问题:编译器如何解释具有或不具有后缀的文字,以及对混合数字类型执行的操作的结果。

5

首先,编译器确实在意f后缀。 1.0是一个双。 1.0f是一个浮点数。例如:

printf("%.15f %.15f\n", 0.1f, 0.1); 

产生0.100000001490116 0.100000000000000(注意,第二个数字是不是真正的0.1比第一任何更多的,它仅仅是接近它)。

这很重要,不仅要确定什么数字,不能代表还要确定这个常数参与行动的类型,例如:

printf("%.15f %.15f\n", 1.0f/10.0f, 1.0/10.0); 

像以前那样产生相同的输出。这里需要注意的是,1和10都可以精确地表示为float以及double。我们所看到的不是四舍五入的文字层次,而是操作类型取决于操作数的类型。

编译器对您的示例没有宽容。他们严格遵守可在the relevant standard中找到的规则,特别是第6.3.1.4和6.3.1.5节。

0

类型文字的是在其它上下文中重要的,例如(假设ffloat):

f = f + 1.0;  // Cast `f` to double, do a double-precision add, and case the result back. 

f = f + 1.0f; // Single-precision addition. 

注意,一些编译器提供了宽松的模式,其中它们两者将产生相同的代码。