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;
}

程序输出:

这里达到了我们想要的目的,特别要注意的就是大小端的问题。

由于系统为小端,低地址放低字节,高地址放高字节。

原文地址:https://www.cnblogs.com/Robotke1/p/3079057.html