在平常的调试过程中,尤其是打开内存监视面板的时候,大家是否想过为什么数据会这样存储,就比如下图的整形变量c,我们明明给他的赋值是16进制的11223344,那他为什么在内存中是反着存储(44332211)的呢?
在解决这个问题前,我们需要先理解大小端的概念
大端:是指大端数据存储模式,简称大端,是指数据的低位保存在内存的高地址中,而数据的高位,保存在内存的低地址中。
小端:是指小端数据存储模式,简称小端,是指数据的低位保存在内存的低地址中,而数据的高位,保存在内存的低地址中。
为什么会有大小端模式之分呢?这是因为在计算机系统中,我们是以字节为单位的,每个地址单元都对应着一个字节,一个字节为8 bit。但是在C语言中除了8 bit的char之外,还有16 bit的short型,32 bit的long型(要看具体的编译器),另外,对于位数大于8位的处理器,例如16位或者32位的处理器,由于寄存器宽度大于一个字节,那么必然存在着一个如何将多个字节安排的问题。因此就导致了大端存储模式和小端存储模式。
例如:一个 16bit 的 short 型 x ,在内存中的地址为 0x0010 , x 的值为 0x1122 ,那么 0x11 为高字节, 0x22 为低字节。对于大端模式,就将 0x11 放在低地址中,即 0x0010 中, 0x22 放在高地址中,即 0x0011 中。小端模式,刚好相反。我们常用的 X86 结构是小端模式,而 KEIL C51 则为大端模式。很多的ARM,DSP都为小端模式。有些ARM处理器还可以由硬件来选择是大端模式还是小端模式。
如何用代码来测试当前环境是大端还是小端存储呢?对于定义一个整形变量 i=1如果他的第一个字节是01那就是低位字节序,如果第一个字节是00,那他就是高位字节序。
故而如此设计: