14 printf输出格式及栈空间分配
2024-10-14 12:20:08
假设在一个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.
第二个参数是任意个数目的参数,所以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
最新文章
- 一些SQL
- 异步等待(ManualResetEvent
- [转]PHP 获取服务器详细信息代码
- c# 使用正则表达式 提取章节小说正文全本篇
- C++ STL map
- 学习VC MFC开发必须了解的常用宏和指令
- CodeForces 158B Taxi(贪心)
- classes目录中没有class文件的一个原因
- openssl 1.1.1 reference
- Visual Studio AI环境记录(Windows10)
- Oracle测试环境参数调整.
- String拼接字符串效率低,你知道原因吗?
- Dubbo集群配置和官方文档
- MongoDB 基本语法笔记
- python学习之re库
- eclipse导入项目文件以及 import项目文件后有个红色感叹号
- 使用Openssl的AES加密算法
- C# 输入一个整数,求质因数
- Shell 学习笔记之运算符
- (转)Linux服务器SNMP常用OID