我是C语言的初学者,学到printf和scanf时有一些疑惑,于是自己研究总结了一些东西,可能会有错误,所以希望各位大牛指正哦~\(≧▽≦)/~啦啦啦
===============================================
I 关于Printf向堆栈传参方式及储存读取方式
一、printf的格式为:
printf(“格式字符串”,参数1,参数2,……);
其传递原理是,先将参数1、参数2、…传递到计算机堆栈中,堆栈类似于一个寄存器。计算机根据变量类型(Datatype)去储存而非根据格式说明符(Format specifier)去储存这些数据。之后printf根据格式说明符的形式去从堆栈中读取这些数据而非根据变量类型。所以一旦变量类型与格式说明符不匹配就会出现错误。
二、考察一下代码
输出结果如下所示
甲行输出的n1、n2并没有问题,而n3、n4出现异常,这是因为n3、n4是长整形变量而使用%e的浮点指数格式符非法输出所导致。同理,乙行的四个参量输出均出现异常,这是因为当第一个浮点型变量用%ld格式符输出出现异常时导致后面都出现异常。
三、原因深层探究
首先根据1中所说,考察printf如何向堆栈传参。首先先将四个参数都变成二进制数,为了方便起见,统一以十六进制表示,两个十六进制数代表一个字节。需要指出,浮点型变量是以IEEE754标准储存(即包括符号位、阶码、尾数),另外,单精度浮点型float自动转换为双精度浮点型double(即64位,包括1个符号位、11个阶码位以及52位尾数位):
向堆栈传参的原则是:每传递一个参量,事先开辟一个与之匹配的大小的空间;由低字节位向高字节位依次储存;对于一个数,