30/20输出居然是0.000000

freefei 2010-12-16 09:50:43
#include "stdafx.h"
#include<stdio.h>

int _tmain(int argc, _TCHAR* argv[])
{
float f=30/20;
printf("%f",sizeof(f));
getchar();
return 0;
}
...全文
216 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
qwqs1314 2010-12-16
  • 打赏
  • 举报
回复
数据类型包括

整型:int,short,long.

实型:float,double.

字符:char.

上述数据类型进行混合运算是合法的。进行运算是,系统会自动进行类型转换。下面介绍:

1,必须转换:char,short一定先转换为int;

float一定先转换为double(双精度)。

2,根据情况选择转换:由于混合运算计算的时候是有顺序的,根据+,-,*,、()的优先级进行运算,所以进行运算的两个操作数,例如int ,double.就会转换为double.

操作数的类型的级别是int, unsigned, long ,double.从低到高。

进行运算的时候,会自动转换为高级别的类型数据。

你的30/20结果就是int型的了
f 接受浮点或者双精度值并将它转换为十进制符号表示法,格式为 [-] ddd.ddd。基数字符(在这里显示为十进制点)后的数字位数等于规定的精度。 如果不指定精度,则输出六个数字。如果精度是 0(零),将不显示基数字符。
你用printf(%f,5)也是输出0.0000的
参考:printf函数不会进行任何类型转换,它只是从内存中读出你所提供的元素的值(按照%d,%f等控制字符提示的格式)。C语言设计中,int类型一般是32bit或者16bit,而float一般是64bit,并且有可能使用科学计数保存。这点就和huhugo88所说一样,5在内存中为00000000,00000101。而且5一般都在静态区,程序的静态存储区默认是0,那么当用%f来读时,就会读64bit,也就是会读之前的很多位0,最后按照(有效数字)×(基数2)pow(指数)的方式来取数,自然结果是0


qwqs1314 2010-12-16
  • 打赏
  • 举报
回复
数据类型包括

整型:int,short,long.

实型:float,double.

字符:char.

上述数据类型进行混合运算是合法的。进行运算是,系统会自动进行类型转换。下面介绍:

1,必须转换:char,short一定先转换为int;

float一定先转换为double(双精度)。

2,根据情况选择转换:由于混合运算计算的时候是有顺序的,根据+,-,*,、()的优先级进行运算,所以进行运算的两个操作数,例如int ,double.就会转换为double.

操作数的类型的级别是int, unsigned, long ,double.从低到高。

进行运算的时候,会自动转换为高级别的类型数据。

你的30/20结果就是int型的了
f 接受浮点或者双精度值并将它转换为十进制符号表示法,格式为 [-] ddd.ddd。基数字符(在这里显示为十进制点)后的数字位数等于规定的精度。 如果不指定精度,则输出六个数字。如果精度是 0(零),将不显示基数字符。
你用printf(%f,5)也是输出0.0000的
参考:printf函数不会进行任何类型转换,它只是从内存中读出你所提供的元素的值(按照%d,%f等控制字符提示的格式)。C语言设计中,int类型一般是32bit或者16bit,而float一般是64bit,并且有可能使用科学计数保存。这点就和huhugo88所说一样,5在内存中为00000000,00000101。而且5一般都在静态区,程序的静态存储区默认是0,那么当用%f来读时,就会读64bit,也就是会读之前的很多位0,最后按照(有效数字)×(基数2)pow(指数)的方式来取数,自然结果是0


cuihuijuan99 2010-12-16
  • 打赏
  • 举报
回复
printf("%d\n",sizeof(f));
printf("%f",f);
输出结果为4
1.00000
zhanghuayi_xiyou 2010-12-16
  • 打赏
  • 举报
回复
30/20 = 1,int/int = int
freefei 2010-12-16
  • 打赏
  • 举报
回复
谢谢了各位,解决了我的疑惑
pengzhixi 2010-12-16
  • 打赏
  • 举报
回复
printf("%f",sizeof(f));

你这个和
printf("%f",10/3);是一样的道理
yuyan_linger 2010-12-16
  • 打赏
  • 举报
回复
printf只会根据内存中的数据解释成对应的参数类型
整数和浮点数在内存中的布局完全不一样 当然不能解释出你要的数据来啦
你可以看看浮点数每个字节都是啥

cout会根据类型自动输出数据
freefei 2010-12-16
  • 打赏
  • 举报
回复
谢谢各位的回答,对我有帮助。我看了他的汇编有些指令看不懂。。。
c是不会将int自动转化为float的是吗
AlanBruce 2010-12-16
  • 打赏
  • 举报
回复
之所以整形显示不出来,是因为float类型存储格式与整形不一样
dieyingao 2010-12-16
  • 打赏
  • 举报
回复
你将 1 当符点数输出了- -
就想叫yoko 2010-12-16
  • 打赏
  • 举报
回复
+1[Quote=引用 7 楼 xy_zhang 的回复:]
printf("%f",(float)30/20);
这样呢
[/Quote]
freefei 2010-12-16
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 xy_zhang 的回复:]

printf("%f",(float)30/20);
这样呢
[/Quote]
这样可以
無_1024 2010-12-16
  • 打赏
  • 举报
回复
强制类型转换
lhy 2010-12-16
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 liubaofeng28 的回复:]
#include "stdafx.h"
#include<stdio.h>

int _tmain(int argc, _TCHAR* argv[])
{

printf("%f",30/20);
getchar();
return 0;
}
输出0.000000
[/Quote]
30/20是整数呀,应该是30.0/20.0
xy_zhang 2010-12-16
  • 打赏
  • 举报
回复
printf("%f",(float)30/20);
这样呢
freefei 2010-12-16
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 xy_zhang 的回复:]

printf("%f",sizeof(f)); <-- 改成%d
[/Quote]
改成%d可以但是为什么,我想问的是
freefei 2010-12-16
  • 打赏
  • 举报
回复
#include "stdafx.h"
#include<stdio.h>

int _tmain(int argc, _TCHAR* argv[])
{

printf("%f",30/20);
getchar();
return 0;
}
输出0.000000
xy_zhang 2010-12-16
  • 打赏
  • 举报
回复
printf("%f",sizeof(f)); <-- 改成%d
freefei 2010-12-16
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 bdmh 的回复:]

你输出的是sizeof(f) ,不是f的值啊
[/Quote]
是我题目写错了,现在显示0.00000
你把sizeof去掉还是0.00000
bdmh 2010-12-16
  • 打赏
  • 举报
回复
你输出的是sizeof(f) ,不是f的值啊
加载更多回复(1)

69,371

社区成员

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

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