鱼C论坛

 找回密码
 立即注册
查看: 1867|回复: 1

转换说明不一致导致程序输出混乱的疑问

[复制链接]
发表于 2017-9-11 13:33:40 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 小蒙 于 2017-9-11 13:38 编辑


                               
登录/注册后可看大图


                               
登录/注册后可看大图

系统环境
size of long is 8
size of float is 4
size of double is 8

截图摘自C primer plus 6th 89页和90页,讲的是printf函数中转换说明和要打印的值不匹配导致的各种异常输出结果,以下是我的个人理解。

如果将一个float传给printf那么在printf输出该float值之前首先将该float转换为double,然后再转换成float输出;如果将double传给printf,那么最后直接就是double输出。截图中有一部分是说程序把传入的值放入stack中,打印是根据转换说明来决定取多少字节进行打印,比如,如果是%ld就从stack中取8个字节,如果是%f,也从stack中取8个字节,程序如下:
  1. float n1 = 3.0;
  2. double n2 = 3.0;
  3. long n3 = 2000000000;
  4. long n4 = 1234567890;

  5. printf("%ld %ld %ld %ld\n", n1, n2, n3, n4);
复制代码

运行结果一会给出,大家先大概猜一下会怎么样输出,根据书中的论述,n1作为float首先要转换成double,double在系统中8个字节,%ld对应的也是8个字节的long,因为打印是根据转换说明来决定取多少字节,所以对于n1来讲,从字节上看,可以“完整地”取出来,因为float是按照指数+尾数储存,所以按照%ld输出,值应该会不一样(没有深究原理),但是毕竟能“完整地取出来”,对后面的取值暂时应该没有影响;然后,n2来了,和n1一样,由于n2是double少了转换,所以取值过程应该和n1一样;接下来的n3和n4,先不管n1和n2的值对不对,至少取得字节数是对的,那么stack中留下来的值打印n3和n4应该可以打印出正确的值,但是运行后结果如下:
  1. 2000000000 1234567890 3298534884355 64
复制代码

注意:虽然n1和n2在前面,但是n3和n4首先被打印了出来,而且后两个值是看不出来什么规律,不懂为什么会这样输出。

刚接触C,什么都不懂,先谢谢各位C友了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2017-9-11 17:28:28 | 显示全部楼层
自顶。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-19 23:10

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表