为什么C自动将float类型的参数转换为double类型?

yjqidai 2009-10-24 05:28:19
1.如printf()传递参数时,C自动将float类型的参数转换为double类型.


2.当为某个数值类型的变量进行初始化时,如果使用了其他类型的值,C会自动对该值进行类型转换以便和变量类型想匹配,这意味着可能会丢失一部分数据.例如下面初始化语句:

第一种:int cost=12.99; //把一个int变量初始化为一个double值.
第二种:float pi=3.1415926536; //把一个float变量初始化为一个double值.



--------------------------------------------------------------------------
我倒觉得第一种说法有一点点正确,但是它说//把一个int变量初始化为一个double值...为什么把一个int变量初始化为一个double值,而不初始化为float值呢?


第二种就看不透是什么意思? 明明用float类型去赋值一个浮点数,可是为什么还要自动转换为double类型?float和double类型都是定义浮点数的类型啊!为什么会这样的?
...全文
2491 11 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
simple0910 2009-11-03
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 hpsmouse 的回复:]
这个问题问得太乱了,大概回答一下……

12.99
这是 double

12.99f
这是 float

12.99l
这是 long double

一个字面浮点常量不带类型后缀就是 double 型,用这个来初始化另一个变量是后话。
[/Quote]
非常有道理啊
unsv29 2009-10-25
  • 打赏
  • 举报
回复
规定!
东大坡居士 2009-10-24
  • 打赏
  • 举报
回复
是没看懂问的啥哈哈
Fenginf 2009-10-24
  • 打赏
  • 举报
回复
C专家编程里有很好的解释
2009-10-24
  • 打赏
  • 举报
回复 2
这个问题问得太乱了,大概回答一下……

12.99
这是 double

12.99f
这是 float

12.99l
这是 long double

一个字面浮点常量不带类型后缀就是 double 型,用这个来初始化另一个变量是后话。
pmerOFc 2009-10-24
  • 打赏
  • 举报
回复
我怎么没看懂楼主问的是什么呢?
borefo 2009-10-24
  • 打赏
  • 举报
回复
1.应该为了是编译器方便的实现
2.标准规定一个浮点字面常量如果没有后缀的话,它的类型是double
标准原文:
A floating constant consists of an integer part, a decimal part, a fraction part, an e or E, an optionally signed integer exponent and an optional type suffix, one of f, F, l, or L. The integer and fraction parts both consist of a sequence of digits. Either the integer part, or the fraction part (not both) may be missing; either the decimal point or the e and the exponent (not both) may be missing. The type is determined by the suffix; F or f makes it float, L or l makes it long double, otherwise it is double.
delphiwcdj 2009-10-24
  • 打赏
  • 举报
回复 1
2 会丢失精度
butwang 2009-10-24
  • 打赏
  • 举报
回复 1
第一种:int cost=12.99; //把一个int变量初始化为一个double值.
第二种:float pi=3.1415926536; //把一个float变量初始化为一个double值.

小数的默认类型是 double 的(占8字节),所以把它赋值给 int ,float(占4字节)都会丢失精度
晨星 2009-10-24
  • 打赏
  • 举报
回复 1
第二个问题中,那两句说的都不好,怎么看起来像是蹩脚翻译一样。我觉得应该这样说:
int cost=12.99; ——使用double值初始化int变量;
第二种:float pi=3.1415926536; ——使用double值初始化float变量。
其结果都是变量保存了转化后的值,比如cost等于12,而pi则损失了一些精度。
晨星 2009-10-24
  • 打赏
  • 举报
回复
这个只是为了简化printf的实现和用法。
如果不这样,不仅实现起来麻烦,用起来也麻烦——它要求你使用scanf和printf的时候,一定要%f和%lf分别表示float和double,绝对不能用错。
而其本质原因在于变参函数中,对于那些可变参数而言,基本没有类型安全可言。
与此类似,char参数也会提升为int来压栈,因此,不管你用%d输出char,还是用%c输出int———比如用来查看字符与其ASCII编码之间的关系——都不会有问题。

70,023

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧