zoukankan      html  css  js  c++  java
  • 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;
    }

    程序输出:

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

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

  • 相关阅读:
    快速查询 jsp页面 和 js方法
    order by 特定字段放在特定的位置
    eclipse中将java项目变成web项目
    Eclipse导入项目:No projects are found to import
    解决【Tomcat version 6.0 only supports J2EE 1.2, 1.3, 1.4, and Java EE 5 Web modul】报错问题
    ORA-24247:网络访问被访问控制列表(ACL)拒绝器
    Oracle 使用UTL_HTTP发送http请求--转载
    Oracle ACL (Access Control List) 详细介绍
    PLSQL中&符号处理
    windows oracle11gR2安装使用
  • 原文地址:https://www.cnblogs.com/Robotke1/p/3079057.html
Copyright © 2011-2022 走看看