当我们创建一个整形变量时,我们会向内存申请一块空间。那么这个数据在内存中是怎么存储的呢?
int mian()
{
int a=2;
return 0;
}
以上代码,我们创建了一个整形变量a,a里面存储了数据2。计算机是以二进制的形式存储数据的,2的二进制是10。在32位平台下,一个整形4个字节,32位二进制。2的16进制形式为:0x00000002,这个时候内存里面是怎么存储呢。这里有两种方式,大端存储,小端存储。那么什么是,大小端存储呢。
小端字节序存储 | 数据低位放在低地址,高位放高地址 |
大端字节序存储 | 数据低位放在高地址,高位放低地址 |
那么,我们如何编写一段代码,判断计算机采用的是哪一种模式呢。
我们可以先写主函数部分。
int main()
{
int ret = check_sys();
if (ret == 1)
printf("小端模式\n");
else
printf("大端模式\n");
return 0;
}
接下来的check_sys()函数有两种实现方式。
1,指针实现。我们知道int类型占4个字节,我们将它转为char*类型,解引用操作时,只访问一个字节。从而,得到的返回值为1,说明01放在低地址,为小端模式。反之,如果是0,则说明01在高地址,为大端模式。
int check_sys()
{
int i = 1;
return *(char*)&i;
}
2.联合体方式。创建一个含有整形和字符类型的联合体。联合体会申请4个字节内存,字符类型只会使用它一个字节的空间,这时,我们给int 类型成员赋值为1。b中会存储第一个字节,我们将un.b返回,得到的返回值为1,说明01放在低地址,为小端模式。反之,如果是0,则说明01在高地址,为大端模式。
int check_sys()
{
//定义联合体
union MyUnion
{
int a;
char b;
};
union MyUnion un;
un.a = 1;
return un.b;
}