#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
是小端存儲
六、一般操作系統都是小端存儲,在通訊協議中一般是大端存儲方式