bboyjing's blog

栈空间和大、小端

我们在学习程序是如何执行的时候,不免会涉及到栈空间的相关知识,有些地方会通俗地说分配栈空间时,栈是向下增长的,那么这句话到底是什么意思,下面我们就以X86架构为例来看一下。

向下增长

我们先来看一下向下增长的理解是什么样的,假设给执行一个方法分配的地址空间为10000~10007,栈空间如下图:

stack_down

由图可以看出地址从10007增长到10000,假设这里一个地址正好存放一个字节,将数据1push入栈的时候,数据将存放在地址10007上,如下:

stack_down_push1

向上增长

然而有些人书写的时候习惯把大的放在下面,这样就产生了向上增长的理解。同样以上面为例,栈空间如下:

stack_up

其实只是把高地址放在了下面,逻辑是一样,将数据1入栈:

stack_up_push1

所以,总的来说,像X86这种架构,栈空间是由高地址向低地址增长。

大端小端问题

如果将一个16进制的数字0x1234入栈,我们刚刚假定了一个地址只能存放一个字节,0x1234有两个字节,这样就会遇到字节序问题,也就是我们常说的大端、小端问题。我们以栈空间向下增长的思想为例,来看下大、小端存储的形式。数字0x1234中12为高位,34为低位。

小端存储

little_endian.jpg

如图,高位存在高地址就是小端存储方式。

大端存储

big_endian

如图,低位存在高地址就是大端存储方式。

本章节就到这里了。