C语言printf("%d",15.0/2)结果为0

本文探讨了C语言中printf函数的行为,特别是在处理不同类型的数据时的情况。通过具体实例解释了当试图打印浮点数除法结果为整数时发生的现象,并深入分析了计算机内存中数据类型的存储方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近刚学C,早晨碰到问题,printf("%d",15.0/2)结果为0 ,原来printf不会执行类型转换。printf调用时,将参数入栈,最后只能看到栈顶的参数,就是printf的第一个参数,然后解析这个字符串,再去栈里挨个找参数,比如printf("%d%d\n", a, b);解析字符串,看到%d时,那么先从栈顶向下偏移一个字符串指针的长度,就是整形数int的位置了,从栈里当前指针的位置到sizeof(int)里边保存的就是这个int a的值了,然后继续解析字符串,看到%f,再去栈中a的上边找一个sizeof(double)的长度,就是double f的值了。

这里计算出来其实已经是double类型了,将double类型入栈,根据计算机组成原理上double类型存储,7.5转换成16进制是0x401e000000000000

在内存中应该是所以printf输出%d是指针只是下移32位,所以结果为0 。%lf输出的才是double7.5.。如果输出%lld,则将这些16进制看成无符号整数,结果为4620130267728707584。。。和内存存储有关。。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值