zoukankan      html  css  js  c++  java
  • 14 printf输出格式及栈空间分配

    假设在一个32位的 little endian的机器上运行下面程序,输出结果:1 0 2

    #include<stdio.h>
    int main() {
        long long a=1,b=2,c=3;
        printf("%d %d %d
    ",a,b,c);
        return 0;
    }

    分析:

    1 printf()是一个库函数,C,C++中函数的参数是从右往左入栈的;

    2 栈的生长方向是从高往低的

    3 小端模式是低位存储在低字节

    4 %d格式输出的是4个字节大小,而long long为8个字节

    所以,a=1,b=0,c=2

    补充:栈是高地址到低地址增长,入栈就反过来了。

    分析二: 
    printf函数的原型是printf(const char*,...); 
    第二个参数是任意个数目的参数,所以printf函数不是分个把参数入栈,而是一股脑全部压入堆栈,因此对于8字节的数据来说,堆栈中的数据是1000 0000 2000 0000 3000 0000,%d按四字节输出,因此,第一个%d输出1,第二个%d输出0,第三个%d输出2。 
    如果改成printf("%d  ", a);printf("%d  ", b);printf("%d ", c);那结果就是1,2,3. 
     
    分析三:

    little endian指低位字节排放在内存的低地址端(就是起始地址)

    long占8个字节,假设其实地址是0,一个地址存一个字节,按照地位编址1,2会按照如下方式存储

    地址 0 1 2 3 4 5 6 7 8 ...

    内容 1 0 0 0 0 0 0 0 2 ...

    %d只能按照四字节连续输出

    那么第一个输出的便是0001=1 第二个输出0000=0 第三个输出0002 

    拥抱明天! 不给自己做枷锁去限制自己。 别让时代的悲哀,成为你人生的悲哀。
  • 相关阅读:
    js固定在顶部
    css垂直居中
    HTML 5离线存储
    jdbc数据库操作
    I/O输入输出流
    异常处理
    java实现冒泡排序算法
    Java 方法
    java 循环 基本类型
    Java中Arrays工具类
  • 原文地址:https://www.cnblogs.com/dd2hm/p/7269185.html
Copyright © 2011-2022 走看看