float和int的相互转化输出

haofang666777 2012-09-06 02:11:01
float x,y;
x=5;
y=3;
printf("x=%d y=%d\n",x,y);
return 0;

输出 0和1075052544

int main()
{
printf("%f",5);
printf("%d",5.01);
return 0;
}
输出 0和一个很大的数

哪位高手能够解释一下?不胜感激。

...全文
4094 15 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
AnYidan 2012-09-14
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 的回复:]

引用 8 楼 的回复:
用printf打印格式和类型不匹配的值 结果不可预料

结果预料起来很费劲而已。
[/Quote]

你违反规则在先,就不要责怪别人不守规矩
startservice 2012-09-14
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 的回复:]

用printf打印格式和类型不匹配的值,结果是不可预料的。
[/Quote]
++
感觉在继续 2012-09-13
  • 打赏
  • 举报
回复
用printf打印格式和类型不匹配的值,结果是不可预料的。
常如意 2012-09-13
  • 打赏
  • 举报
回复
float当按照int输出时,系统会取前四个字节
noal0502 2012-09-13
  • 打赏
  • 举报
回复
Int, float, double 之间的相互转换:

Int :在.NET中,int是一个有符号32位整数 ,无论处理器是32位还是64位。它的.NET框架类型是System.Int32 。

Float:单精度浮点数,32位长度,1位实数符号位(原码表示),1位指数符号位,7位指数位(此八位为移码表示)以及23位数据位(补码表示),在.net中又称为Single。

Double: 64位长度的双精度浮点数,1位符号位,11位指数位,52位数据位。

三者的关系:int可以隐式转换成float和double;float只能强制转换成int,但是可以隐式转换成double;double只能强制转换成float和int。
晚安_好梦 2012-09-13
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 的回复:]
引用 8 楼 的回复:
用printf打印格式和类型不匹配的值 结果不可预料

结果预料起来很费劲而已。
[/Quote]

恩,个人结果是可以预料的。只是算起来比较费劲而已,顶9楼。
赵4老师 2012-09-06
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 的回复:]
用printf打印格式和类型不匹配的值 结果不可预料
[/Quote]
结果预料起来很费劲而已。
常如意 2012-09-06
  • 打赏
  • 举报
回复
用printf打印格式和类型不匹配的值 结果不可预料
iamnobody 2012-09-06
  • 打赏
  • 举报
回复
http://en.cppreference.com/w/cpp/io/c/fprintf

用正确的格式符 来输出!!!!!
wanglu343280746 2012-09-06
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 的回复:]
首先解释float x=5;printf("x=%d",x);float型数据在计算机中以IEEE754标准存储第一位为符号位,接下来八位是指数位,后23位为有效数字位,具体规则参照IEEE754,5的机器表示为0 10000001 0100 0000 0000 0000 0000 000,之后还有一个规则,机器在存储浮点数的时候 会以双精度的形式存储,此时就涉及到将单精度转换为双精度的问题,二进……
[/Quote]
学习了
tjl63433 2012-09-06
  • 打赏
  • 举报
回复
首先解释float x=5;printf("x=%d",x);float型数据在计算机中以IEEE754标准存储第一位为符号位,接下来八位是指数位,后23位为有效数字位,具体规则参照IEEE754,5的机器表示为0 10000001 0100 0000 0000 0000 0000 000,之后还有一个规则,机器在存储浮点数的时候 会以双精度的形式存储,此时就涉及到将单精度转换为双精度的问题,二进制表示为0 10000000001 0100 0000 0000 0000(之后还有36个0),以%d输出时,取后32位,所以输出值为0,对5.01用此种办法转换,也讲得出期望值;
接下来,说一下printf("x=%d y=%d\n",x,y);此时y的输出值只于参数表中的有关,即实际上参数表中的y实际上没有传到函数里面,你可以试一下输出printf("x=%d y=%d\n",x);与刚才的输出相同。
辛苦打的,新人求分。
AndyZhang 2012-09-06
  • 打赏
  • 举报
回复
你可以按照IEEE754将5.01转换为字节保存,然后按照int读出,,看看是多少
AndyZhang 2012-09-06
  • 打赏
  • 举报
回复
你要知道float在内存中是如何保存的,是按照IEEE规范的,所以当按照int输出时,系统会取前四个字节,这四个字节可能是float数的指数或者头或者尾的组合,这个值应该是这样的。但是如果你强制转换的话,就不一样了,系统会把float转int保存,这样估计你就能输出5了
图灵狗 2012-09-06
  • 打赏
  • 举报
回复
用printf打印格式和类型不匹配的值,结果是不可预料的。

70,021

社区成员

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

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