什么是大小端模式
大端(存储)模式:数据的低位保存在内存的高地址中,数据的高位保存在内存的低地址中;
小端(存储)模式:数据的低位保存在内存的低地址中,数据的高位保存在内存的高地址中。
那么如何来判断自己的机器是哪种存储模式呢?
代码一:
#define _CRT_SECURE_NO_WARNINGS 2
#include<stdio.h>
#include<stdlib.h>
union Un
{
int a;
char c;
};
int main()
{
union Un un;
un.a = 1; //在联合体的四个字节中存储1,然后输出最低字节的内容,是1则小端,是0则大端
printf("%d\n", un.c);
system("pause");
return 0;
}
在联合体中所有变量共用一块内存单元,首先在联合体的四个字节中存储1,un.a=1;即存储00000000 00000000 00000000 00000001这一串01序列,然后把un.c输出出来,即把这四个字节中地址最低的一个字节的内容取出来,如果是1,则是小端模式,如果是0则是大端模式!
代码二:
#define _CRT_SECURE_NO_WARNINGS 2
#include<stdio.h>
#include<stdlib.h>
int check_sys()
{
int a = 1;
return *(char*)&a; // 取地址默认取最低字节地址。将整型地址强制转换为char*类型
//再进行解引用,即取得最低字节里面的内容,如果是1,则是小端,0则大端。
}
int main()
{
int ret = 0;
ret = check_sys();
if (1 == ret)
{
printf("小端模式\n");
}
else if (0==ret)
{
printf("大端模式\n");
}
system("pause");
return 0;
代码二的原理和代码一基本一样,首先在check_sys函数里面定义一个整型变量a,为其分配四个字节,存储00000000 00000000 00000000 00000001;然后对它进行取地址运算(取得的地址默认是这四个字节中地址最低的字节的地址),因此只要我们知道了这个字节里面的内容是什么就可以判断出这台机器的存储模式了!
因为&a是int* 类型的,我们只需取最低位字节的地址,因此需要强制类型转换为char*类型,然后再解引用即可取出里面存储的值。如果是1,则是小端存储模式,是0,则是大端存储模式。