#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的存储情况为
内存地址 | 大端存储 | 小端存储 |
0x8000 | 0x12 | 0x78 |
0x8001 | 0x34 | 0x56 |
0x8002 | 0x56 | 0x34 |
0x8003 | 0x78 | 0x12 |
五、程序判断自己电脑的存储方式
1,使用共用体
union {
int a;
char b;
}num;
num.a=0x12345678;
cout<<hex<<int(num.b)<<endl; // 在int大小的四个字节中取出第一个判断
在我的电脑上输出78 可知本机上的存储方式为小端存储
2,使用地址转换
int a=0x12345678;
char b=*(char *)&a;
if(b==0x12)
是大端存储
Else
是小端存储
六、一般操作系统都是小端存储,在通讯协议中一般是大端存储方式
本文出自 “Vs吕小布” 博客,谢绝转载!