14 printf输出格式及栈空间分配

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

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

分析:14 printf输出格式及栈空间分配

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("%dn", 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
原文链接: https://www.cnblogs.com/dd2hm/p/7269185.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/257740

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年2月14日 上午11:11
下一篇 2023年2月14日 上午11:12

相关推荐