C中的浮点常量

时间:2010-05-24 01:25:32

标签: java c casting types

我有一个关于C中浮动常数的问题。

在Java中,double的默认浮点常量类型,因此以下将导致java中的编译错误:

float f = 100.0;   // we either need to uses type case operator or put f at the end of the number constant.

这是因为默认的浮点常量是double类型,并且从double转换为float而没有类型转换操作符是一个错误,所以我们需要添加一个类型case操作符或将f放在数字的末尾。 / p>

所以,为什么在C中这不会产生错误,是因为默认的浮点常量是float类型,还是因为编译器执行了隐式的转换转换(这不需要在C)中键入case运算符

3 个答案:

答案 0 :(得分:8)

在C中,默认情况下浮点常量的类型为double,但double可以隐式转换为float(请注意,您必须要小心:如果值常量超出float可表示的范围,这种转换的结果是未定义的。)

如果您想要float类型的浮点常量,可以将后缀f附加到常量的末尾。

答案 1 :(得分:4)

未混合的浮点常数在C中也是双倍的。见the standard的§6.4.4.2:

你说得对,它缩小了:

§6:3.1.5:

  

“当双人降级为浮动时,a   long double被降级为double或者   float,或表示的值   更高的精度和范围   语义类型所要求的(见   6.3.1.8)如果值为,则显式转换为其语义类型   转换可以准确表示   在新类型中,它没有变化。如果   被转换的价值在   可以的值范围   代表但不能代表   确切地说,结果是   最接近或最近的   可表示的值,选择在   实现定义的方式。如果   被转换的价值超出了   可以的值范围   表示,行为是   理解过程科幻定义。“

§6:5.16:

  

“赋值表达式的类型   是左操作数的类型[...]“

§6:5.16.1:

  

“在简单赋值(=)中,值   右操作数的转换为   赋值表达式的类型   并替换存储在中的值   左边指定的对象   操作数“。

答案 2 :(得分:2)

C默默地将 double 转发给 float 。而且,正如已经指出的那样,浮点文字被认为是双重的。

gcc 中,编译器选项 -Wconversion (未在 -Wall 中隐含)会对此向下转发发出警告(例如,在文字分配中,如在你的问题中)。

  

警告:从'转换为'浮动'   'double'可能会改变其价值