【C語言】 檢測大小端存儲

#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的存儲情況爲
內存地址
大端存儲小端存儲
0x80000x120x78
0x80010x340x56
0x80020x560x34
0x80030x780x12
五、程序判斷自己電腦的存儲方式

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


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章