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

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

分析:

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\n", 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

14 printf输出格式及栈空间分配的更多相关文章

  1. printf 输出格式

    printf 输出格式C中格式字符串的一般形式为: %[标志][输出最小宽度][.精度][长度]类型,其中方括号[]中的项为可选项.各项的意义介绍如下:1.类型类型字符用以表示输出数据的类型,其格式符 ...

  2. C语言的printf输出格式控制

    C语言的printf输出格式控制 printf大家都耳熟能详,但是能真正将其用法弄透的估计很少见. 转一篇,改天整理. 1.转换说明符 %a(%A)     浮点数.十六进制数字和p-(P-)记数法( ...

  3. c语言printf()输出格式大全(转载)

    1.转换说明符      %a(%A)     浮点数.十六进制数字和p-(P-)记数法(C99)      %c             字符      %d             有符号十进制整 ...

  4. C语言printf()输出格式大全

    1.转换说明符       %a(%A)     浮点数.十六进制数字和p-(P-)记数法(C99)       %c             字符       %d             有符号十 ...

  5. Printf()输出格式控制(转)

    int printf(const char *format,[argument]); format 参数输出的格式,定义格式为: %[flags][width][.perc] [F|N|h|l]typ ...

  6. 汇编中call printf参数压栈时错误理解

    EAX, ECX,EDX,EBX均可以32bit,16bit,8bit访问,如下所示: <-------------------EAX------------------------>|& ...

  7. printf输出格式总结

    printf函数称为格式输出函数,其关键字最末一个字母f即为"格式"(format)之意.其功能是按用户指定的格式,把指定的数据显示到显示器屏幕上. printf函数调用的一般形式 ...

  8. 从C中变化过来的各种语言的printf输出格式

    在c.php和shell中经常可以碰到printf的使用,特别是在php中printf的相关变种有好几个:print.printf.sprintf.vprintf.vsprintf     在这些语言 ...

  9. printf输出格式

    tips:#为空格                                   Printf 格式化字符串  格式代码 A ABC ABCDEFGH %S A ABC ABCDEFGH %5S ...

随机推荐

  1. logistic回归和softmax回归

    logistic回归 在 logistic 回归中,我们的训练集由  个已标记的样本构成:.由于 logistic 回归是针对二分类问题的,因此类标记 . 假设函数(hypothesis functi ...

  2. 在浏览器输入url后并回车发生了哪些过程

    1.解析URL ________________________________________________________________________ 关于URL: URL(Universa ...

  3. fiddler配置及使用教程

    本文基于Fiddler4讲解基本使用 fiddler抓包原理 注意:Fiddler 是以代理web服务器的形式工作的,它使用代理地址:127.0.0.1,端口:8888.当Fiddler退出的时候它会 ...

  4. SpringCloud请求响应数据转换(二)

    上篇文章记录了从后端接口返回数据经过切面和消息转换器处理后返回给前端的过程.接下来,记录从请求发出后到后端接口调用过的过程. web请求处理流程 源码分析 ApplicationFilterChain ...

  5. git如何获取用户名和邮箱

    答: git config user.name  (获取用户名)   git config user.email (获取邮箱)

  6. CodeCombat多人游戏Greed

    题目的意思在于,更高效的Collect Gold:然后合理的安排生产出来的士兵: // This code runs once per frame. Build units and command p ...

  7. C#调用系统蜂鸣(需要发出警告时挺好用的 即使没有声卡)

    http://heavenslv.iteye.com/blog/1033870 // 声明 public class BeepUp { /// <param name="iFreque ...

  8. dubbo 实战总结

    1,出现重复调用.因为有重试机制,可以改为异步调用或者幂等操作.

  9. Linux下指定pip install和make install安装路径

    在Linux下直接用pip install packageName,有些文件会被放到根目录下,如果没有sudo权限的话,是会安装失败的.这个以后我们就需要指定安装的目录了. pip install - ...

  10. 51nod 1412 AVL树的种类(经典dp)

    http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1412 题意: 思路: 经典dp!!!可惜我想不到!! $dp[i][k] ...