C语言中有的程序为什么用float能运行出结果而double不行?

double精度范围比float大,居然昨天晚上我做的那个程序float能运行出正确结果,用double就不行?

是这样子的,在用sscanf/fscanf/scanf来扫描指定字符串按特定格式存储到变量时,需要指定合适的convention specifier,而type modifier有时可以忽略。但是在有些时候,type modifier是必须的,不指定type modifer会得不到期望的输入。以float/double类型为例:
float fvalue;
double dvalue;
scanf("%f", &fvalue) -------------> 将标准输入存储到float类型变量
scanf("%lf", &dvalue) ------------> 将标准输入存储到double类型变量
现在看,如果用"%f" 来转化存储double类型变量会有什么结果?

scanf("%f", &dvalue) -------------> dvalue的值将不会是你期望的浮点值,多数情况下是0

现在再看 convention specifier:
f ---------- 匹配一个有符号浮点数;下一个指针必须是浮点数的指针。(那么问题来了,double--8字节,也是浮点数,float--4字节也是浮点数,困惑么?)

再看type modifier:

l --------- 指示convention将会是d,i,o,u,x,X 或者n中的一个并且下一个指针必须是指向长整型或者无符号长整型(而不是4字节的整型),或者指定convention将是e,f或g中的一个并且下一个指针必须是指向double(而不是4字节的float)。

看到这里,我想你已经清楚为何不能用"%f" 来对应double了。

至于为什么会出现这样的情况,是因为标准库对于变参(sscanf/scanf/fscanf的格式化参数是变参)的处理原理。标准库利用va_start/va_arg/va_end 宏来处理变参。其本质是通过指针给你的变量赋值,所以标准库需要知道你的变量的长度。int是4个字节,long int 是8个字节;同样float是4个字节,double是8个字节。试想将8个字节的内存存储的值,以指针操作内存的方式存储到4个字节内存中,会出现什么情况? “截断”,就是“截断”,因为出现了截断,所以你得到的值,只是8个字节中的低MSB或者高MSB的4个字节而已,因此值不是你想要的。
温馨提示:答案为网友推荐,仅供参考
第1个回答  2015-01-31
是不是涉及了计算?如果是函数间的值传递,float类型会自动转换为double类型的。

相关了解……

你可能感兴趣的内容

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 非常风气网