你的机器是大端还是小端?——测试一下你就知道。
大端模式(Big-endian):
是指数据的低位(就是权值郊县的后面那几位)保存在内存的高地址中;
而数据的高位,保存在内存的低地址中。
这样的恶存储方式有点儿类似把数据当做字符串顺序处理:地址由小向大增加,而数据从高位往低位放。
小端模式(Little-endian):
是指数据的低位保存在内存的低地址中;
而数据的高位保存在内存的高地址中,和我们的逻辑方式一致。
补充一些知识点:
1、内存的地址:从左往右、从上往下依次增大;
2、数据:左边是高位,右边是低位。
判断是大小端的方法:
1、利用指针强制类型转换;
2.、利用共用体所有数据共用同一块地址空间
具体实现:
第一种方法:利用指针进行强制类型转换
#include<stdio.h>
int check_endian(int a)
{
char *p = (char*)&a;//用指针p强制让它指向a的低地址,才能知道p拿到的是a的低位还是高位。
if (*p == 1)
{
printf("你的机器是 Little-endian");
}
else
{
printf("你的机器是 Big-endian");
}
return 0;
}
int main()
{
int a = 1;
check_endian(a);
return 0;
}
第二种方法: 利用共用体所有数据共用同一块地址空间
#include<stdio.h>
union A
{
char c;//内存按字节存储
int a;
}A;
int main()
{
A.a = 1; //共用体占用的内存大小是最大元素所占内存大小
if (A.c==1)
{
printf("你的机器是 Little-endian");
}
else
{
printf("你的机器是 Big-endian");
}
return 0;
}
联合体union的存放顺序是所有成员都从低地址开始存放,所以很容易就判别出机器的大小端了。