printf格式串中的%f到底是float还是double?实验来证明!
2013-09-14 09:49
337 查看
zz : /article/7107107.html
最近在CSDN上看到一个网友写下了类似如下代码,想以小数格式输出一个整数:
int a = 0, b = 0;
printf("%f, %d", a, b);
可是运行结果并不尽如人意,%f字段输出了0,%d字段输出一个较大的数据。
因为我最近刚阅读了浮点数的内存表示方法,所以对上述代码做出解释如下:
%f为double类型,需要两个字节表示,所以,printf在遇到%f时即将a,b的两个整型数据都读了去,而到了需要输出%d的时候,只能读取b的下一个单元,自然不是所期望的数据了。
但是有朋友说%f是float类型,%lf才是double类型,具此我特意查阅了MSDN和Linux man手册,均没有发现此类描述,在linux man手册中,说明%lf为long double类型。
为了说明问题,我又做了几个实验:
实验一,检查%f需要读取几个字节
int a=0, b=0, c=5;
printf("%f,%d\n", a, b, c);
输出结果:
0,5
结论:%f读取8个字节,即两个整型大小
实验二,检查%lf需要读取几个字节
int a=0, b=0, c=5;
printf("%lf,%d\n", a, b, c);
输出结果:
0,5
结论:%lf也读取8个字节(也许和机器位宽有关,我是32位的机器)
实验三,检查printf读取float类型数据
float a=0.0f;
int b=5;
printf("%f,%d\n", a, b);
输出结果:
0.0,5
结论:float类型只占4个字节的数据,但前面实验一已经证明%f会读8个字节,即double类型的宽度,所以,编译器在将float类型参数入栈的时候,事先转换成了double类型。
实验四,再次证明实验三的结论
float a=0.0f;
int b=5;
printf("%d,%d,%d\n", a, b);
输出结果:
0,0,5
结论:a在入栈的时候,占了8个字节。
以上4步,我觉得可以证明%f是按double类型输出的了,另外,我也知道了float类型在作为参数进行传递的时候,编译器会先将它转换成double类型。
最近在CSDN上看到一个网友写下了类似如下代码,想以小数格式输出一个整数:
int a = 0, b = 0;
printf("%f, %d", a, b);
可是运行结果并不尽如人意,%f字段输出了0,%d字段输出一个较大的数据。
因为我最近刚阅读了浮点数的内存表示方法,所以对上述代码做出解释如下:
%f为double类型,需要两个字节表示,所以,printf在遇到%f时即将a,b的两个整型数据都读了去,而到了需要输出%d的时候,只能读取b的下一个单元,自然不是所期望的数据了。
但是有朋友说%f是float类型,%lf才是double类型,具此我特意查阅了MSDN和Linux man手册,均没有发现此类描述,在linux man手册中,说明%lf为long double类型。
为了说明问题,我又做了几个实验:
实验一,检查%f需要读取几个字节
int a=0, b=0, c=5;
printf("%f,%d\n", a, b, c);
输出结果:
0,5
结论:%f读取8个字节,即两个整型大小
实验二,检查%lf需要读取几个字节
int a=0, b=0, c=5;
printf("%lf,%d\n", a, b, c);
输出结果:
0,5
结论:%lf也读取8个字节(也许和机器位宽有关,我是32位的机器)
实验三,检查printf读取float类型数据
float a=0.0f;
int b=5;
printf("%f,%d\n", a, b);
输出结果:
0.0,5
结论:float类型只占4个字节的数据,但前面实验一已经证明%f会读8个字节,即double类型的宽度,所以,编译器在将float类型参数入栈的时候,事先转换成了double类型。
实验四,再次证明实验三的结论
float a=0.0f;
int b=5;
printf("%d,%d,%d\n", a, b);
输出结果:
0,0,5
结论:a在入栈的时候,占了8个字节。
以上4步,我觉得可以证明%f是按double类型输出的了,另外,我也知道了float类型在作为参数进行传递的时候,编译器会先将它转换成double类型。
相关文章推荐
- printf格式串中的%f到底是float还是double?实验来证明!
- printf格式串中的%f到底是float还是double?实验来证明!
- printf格式串中的%f到底是float还是double?实验来证明!
- printf格式串中的%f到底是float还是double?实验来证明!
- 【转】printf格式串中的%f的输出格式和内容
- float:double类型数据在内存中中存储格式
- scanf输入格式实验&printf语句输出实验
- printf中输出double的占位符、printf和scanf对于各种格式说明符可以接受的参数类型
- java float double string转换和根据是否是小数判断显示格式
- java包装类型的MAX_VALUE到底是多少啊 Double.MAX_VALUE Float.MAX_VALUE
- base64到底是编码格式还是加解密
- Dev-C++下关于float/double类型的实验
- C函数printf中不能使用%lf,而用%f输出double,而函数scanf却必须用%lf来输入double
- 【C语言】[库函数]:printf 函数 和 scanf 函数 对float 和double 类型打印和读取
- printf中用%d输出float或者double
- int_float_double数据类型的存储格式。
- 转:C语言中的printf用%d输出float类型数据出现或以%f输出int型数据的结果为什么是0
- Java在终端中实时计算时使用float还是double?
- c语言格式输出剖析——用%d输出float类型数据与int类型%f格式输出
- C语言中关于float和double的输入输出格式