1256344576.45是double还是float

float数据类型double数据类型内存存储及精度分析;

}

刷题的时候做了这样一题

(代码寫的很垃圾。)

后来自己找错误发现最后判断double型变量是否>=0时出错了,不能直接和0比较

}

其实我一直就以为printf中的%f是double类型的可是有朋友却说是float类型的,%lf才是double类型在查阅MSDN和Linux手册后,找到的说明确实%f是double类型但我还是决定再做个实验证明一下。而且我还发现,float类型在参数传递时是会被转换成double的。

最近在CSDN上看到一个网友写下了类似如下代码想以小数格式输出一个整数:


可是运行结果并不尽洳人意,%f字段输出了0%d字段输出一个较大的数据。

因为我最近刚阅读了浮点数的内存表示方法所以对上述代码做出解释如下:

%f为double类型,需要两个字节表示所以,printf在遇到%f时即将a,b的两个整型数据都读了去而到了需要输出%d的时候,只能读取b的下一个单元自然不是所期望的數据了。但是有朋友说%f是float类型%lf才是double类型,具此我特意查阅了MSDN和Linux man手册均没有发现此类描述,在linux man手册中说明%lf为long

为了说明问题,我又做了幾个实验:

实验一检查%f需要读取几个字节

结论:%f读取8个字节,即两个整型大小

实验二检查%lf需要读取几个字节

结论:%lf也读取8个字节(也許和机器位宽有关,我是32位的机器)

实验三检查printf读取float类型数据

结论:float类型只占4个字节的数据,但前面实验一已经证明%f会读8个字节即double类型的宽度,所以编译器在将float类型参数入栈的时候,事先转换成了double类型

实验四,再次证明实验三的结论

结论:a在入栈的时候占了8个字節。

以上4步我觉得可以证明%f是按double类型输出的了,另外我也知道了float类型在作为参数进行传递的时候,编译器会先将它转换成double类型

}

我要回帖

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信