马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
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个字节,程序如下:float n1 = 3.0;
double n2 = 3.0;
long n3 = 2000000000;
long n4 = 1234567890;
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应该可以打印出正确的值,但是运行后结果如下:2000000000 1234567890 3298534884355 64
注意:虽然n1和n2在前面,但是n3和n4首先被打印了出来,而且后两个值是看不出来什么规律,不懂为什么会这样输出。
刚接触C,什么都不懂,先谢谢各位C友了。
|