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

    程序输出:

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

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

  • 相关阅读:
    气象数据之风向数据json格式解析
    气象数据之风向数据展示原理
    js之生成json文件
    气象数据之grib2转json
    气象数据之全球方向数据(grib2)下载
    气象数据之数据查看(panoply)
    arcgis js 3.x 之弹框拖动后添加引导线
    arcmap加载netcdf(.nc)数据
    ol3之测试项目
    ol3之加载arcgis wms图层
  • 原文地址:https://www.cnblogs.com/Robotke1/p/3079057.html
Copyright © 2011-2022 走看看