printf()函数入栈顺序
查了网上的资料,总结一下:
(1)C语言入栈的顺序从右向左,printf函数是确定不了参数的个数的,也不对类型进行检查。
(2)char、short类型的输出是以int进行的。
例子:
#include <stdio.h> int main(int argc, char** argv) {
// ① printf("%d %d %d\n", 1);
// ② printf("%d %d %d\n", 1, 3, 4, 6, 5, 2);
// ③ printf("%lld %d %d\n", 1, 3, 4, 6, 5, 2); return 0; }
程序输出:
解释:
(1)因为这里printf是确定不了参数个数的,所以少参数也不会报错,然后1入栈。
参数都入栈完成了之后,根据“%d %d %d\n”格式控制符进行出栈。
栈顶指向1,第一个%d对应的是1,1出栈,第二个%d对应的栈的内容就是未知的了,第三个也是未知内容。
(2)同理将这些参数从右到左进行入栈。然后根据格式控制符进行出栈。
1为栈顶,继续,3,4。只有三个%d格式控制符,所以也只输出1、3、4。
(3)同理入栈,根据格式控制符“%lld %d %d\n”进行解析,
%lld对应的内容就是1和3,其次的%d对应的是4,在下一个%d对应的是6。
00 00 00 01
00 00 00 03
由于是小端的,组成long long类型就成了00 00 00 03 00 00 00 01
转化为10进制等于12884901889,与上面输出的内容相符。
如图所示:
#include <stdio.h> int main(int argc, char* argv[]) { int number = 0x41424344; printf("%c %c %c %c\n", number); return 0; }
程序输出:
可以看到程序并非我们所想的那样子输出D C B A。
这是因为printf是以int进行输出的。
如图:
每一个%c对应一个int类型,并且每个%c指向的是每个int类型的最低的那个字节。
例子3:
#include <stdio.h> #include <stdlib.h> #include <string.h> int main(int argc, char* argv[]) { long long number1 = 0x0000004200000041; long long number2 = 0x0000004400000043; printf("%c %c %c %c\n", number1, number2); return 0; }
程序输出:
这里达到了我们想要的目的,特别要注意的就是大小端的问题。
由于系统为小端,低地址放低字节,高地址放高字节。