大小端?堆栈增长方向?数组增长方向?

本文通过代码示例分析了C语言中数组、堆栈和内存的存储方式。指出数组增长方向是从低地址到高地址,而栈从高地址向低地址增长,堆则相反。同时,讲解了大小端表示法,强调大小端是针对单元内部字节的排列,并通过示例解释了在小端系统中,数组增长方向与单元内部顺序的相反性。此外,还讨论了移位操作与大小端的关系。
摘要由CSDN通过智能技术生成

  这个问题源自某讨论课题,闲话少说,直接上代码:

#include<stdio.h>
int main(int argc, char** argv) {
    int a[] = {('l'<<24) + ('l'<<16) + ('e'<<8) + 'h', 'o'};
    printf("%x%x\n", a[0], a[1]);
    puts((char*)a);
    return 0;
}

输出结果为:

6c6c65686f
hello

这个代码十分简单,就是在测试c标准对一些“神奇”的操作的默认做法以及机器内存存储方式。这里疑点最大的为数组a,为什么会是‘l’‘l’‘e’‘h’‘o’呢?分析一下:

1. 字符在进行数值运算时将会转化为int,这点可以通过sizeof('c'-'a')来验证。(因此这里不会出现这样的warning: left shift count >= width of type [-Wshift-count-overflow])

2. 可以发现a此时在内存中的呈现(这里用assic字符代替对应的数值,也就是'l' = 0x6c、'e' = 0x65)为:

上为高地址

   \0                        -------

   \0                  

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值