在计算机存储中有两种存储方式,分别为大端,小端;
大端存储:高权重的存放在高地址
小端存储:低权重的存放在高地址
eg:20的大小端存储
1:大端 : 00 00 00 14
2:小端:14 00 00 00
如何使程序鉴定机器是大端存储还是小端存储?
eg1:
check_sys()
{
int i = 1;
return (*(char *)&i);
}
int main()
{
int ret = check_sys();
if (ret == 1)
{
printf("小端\n");
}
else
{
printf("大端\n");
}
system("pause");
return 0;
}
分析:
1在计算机中的二进制为
0000 0000 0000 0000 0000 0000 0000 0001
十六进制存储为 00 00 00 01
故 如果是大端存储为 00 00 00 01
小端存储为 01 00 00 00
故用(char*)将&i强制转化为char*类型
此时若是大端:为00
此时若为大端:为01
eg2:
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
int check_sys()
{
union
{
int a;
char b;
}un;
un.a = 1;//0X 01 00 00 00
return un.b; // 0X 01
}
int main()
{
int ret = check_sys();
{
printf("%d\n", ret);
}
system("pause");
return 0;
}
分析:
union(联合体)里是共用一块地址的
所以当给int类型的a赋值为1时,因为计算机内部为小端存储
所以在输出char类型的b时才会输出1故证明了大小端