j_0020.gif探究电脑存储机制是大端模式还是小端存储模式,首先就该知道什么是大端和小端模式???


    计算机存储数据(如一个int型)时分为大端存储和小端存储两种方式;


    小端存储方式:低地址存储低字节数据,高地址存储高字节数据。

    大端存储方式:低地址存储高字节数据,高地址存储低字节数据。

j_0036.gif什么是内存的高低地址呢???

以图为例:

wKioL1dWdX_Bfb1oAABINGhbijQ512.png

假如在栈上分配一个char buff[4],那么数组变量在栈上如何分布,依然是直接上图,废话不多说:

wKioL1dWdyigvjdFAAASFHS-wwQ203.png

j_0041.gif弄清了高低地址,在讨论下高低字节。

wKiom1dWeFaw8BjCAABQg3kt3CY894.png

下面图是我从网上这是你过来的,原理是一样的,舍不得给他删了,也留着吧。

小端存储方式示意图(如下):

http://blog.chinaunix.net/p_w_upload/201112/22/25365622_1324545027Qk9m.jpg

j_0071.gif了解了大端和小端的概念和内存的空间分布,下面设计方法测试电脑的存储方式。


测试方法


    1. 定义一个包含int型变量 和 char型变量的联合体union 

    2. 将int型变量强制转换为 char*


方法一

    由于联合体union的存放顺序是所有成员从低地址开始存放,在一个“联合”内可以定义多种不同的数据类型,一个被说明为该“联合”类型的变量中,允许装入该“联合”所定义的任何一种数据,这些数据共享同一段内存,已达到节省空间的目的,

例如:

#include <stdio.h>
#include <stdlib.h>

int checkSystem()
{
    union check
    {
        int i;
        char ch;
    }c;
    c.i = 1;
    return (c.ch == 1);        //c.ch如果等于1,则返回1,否则返回0;
}                              //返回1说明该计算机是小端存储,相反是大端存储

int main()
{
    int a = checkSystem();
    printf("%d\n", a);
    system("pause");
    return 0;
}

wKioL1dWcSiRDkXvAAASa4Fq1tU453.png

方法二

    将×××变量强制转换为(char*),这样就可以以字节为单位进行数据读取了;

例如:

int checkSystem()
{
    int v = 1;
    if (*((char *)&v) == 1)        
        return 1;        //返回1说明是小端存储
    else
        return 0;        //返回0说明是大端存储
}

j_0028.gif到这里就搞清楚计算机对于字节的存储机制了,大端还是小端去测试一下吧