我有一个关于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运算符
答案 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'可能会改变其价值