[置顶] 【C语言】 检测大小端存储
2016-05-26 12:25
633 查看
[code=cpp;toolbar:false">#include <stdio.h>
int sys_check()
{
int i = 1;
char *pi = (char *)&i; //强制类型转换为char *,取首字节的内容,用以判断条件
//if (1 == *(char *)&i)
if (*pi == 1)
{
return 1;
}
else
{
return 0;
}
}
int main()
{
int ret = sys_check();
if (ret == 1)
{
printf("little\n"); //小端存储
}
else
{
printf("big\n"); //大端存储
}
return 0;
}
此外,可以使用联合体(共用体) union:
封装另一个共同功能的函数:
(main函数缺省)
int sys_check()
{
union UN
{
int i;
char c;
}un;
un.i = 1;
if (un.c == 1)
{
return 1;//返回1表示小端
}
else
{
return 0;//返回0表示大端
}
}
上面是以 1 为例判断,以下是详细对大小端存储的解释:
一、大端模式:低位字节排放在内存的高地址端,高位字节在内存的低地址端
二、小端模式:低位字节排放在内存的低地址端,高位字节在内存的高地址端
三、一个整型数字,0x12345678在内存里的存储方式,
a 大端模式
0x12 0x 34 0x56 0x78
低地址 → 高地址
b小端模式
0x78 0x 56 0x34 0x12
低地址 → 高地址
*** 大端模式的内存存储与字符串存储类似,小端模式则相反
四、若起始地址为0x8000,则0x12345678的存储情况为
int sys_check()
{
int i = 1;
char *pi = (char *)&i; //强制类型转换为char *,取首字节的内容,用以判断条件
//if (1 == *(char *)&i)
if (*pi == 1)
{
return 1;
}
else
{
return 0;
}
}
int main()
{
int ret = sys_check();
if (ret == 1)
{
printf("little\n"); //小端存储
}
else
{
printf("big\n"); //大端存储
}
return 0;
}
此外,可以使用联合体(共用体) union:
封装另一个共同功能的函数:
(main函数缺省)
int sys_check()
{
union UN
{
int i;
char c;
}un;
un.i = 1;
if (un.c == 1)
{
return 1;//返回1表示小端
}
else
{
return 0;//返回0表示大端
}
}
上面是以 1 为例判断,以下是详细对大小端存储的解释:
一、大端模式:低位字节排放在内存的高地址端,高位字节在内存的低地址端
二、小端模式:低位字节排放在内存的低地址端,高位字节在内存的高地址端
三、一个整型数字,0x12345678在内存里的存储方式,
a 大端模式
0x12 0x 34 0x56 0x78
低地址 → 高地址
b小端模式
0x78 0x 56 0x34 0x12
低地址 → 高地址
*** 大端模式的内存存储与字符串存储类似,小端模式则相反
四、若起始地址为0x8000,则0x12345678的存储情况为