【轉】如何判斷CPU是大端還是小端模式

來源:互聯網
上載者:User

標籤:

原文網址:http://blog.csdn.net/ysdaniel/article/details/6617458

如何判斷CPU是大端還是小端模式http://blog.sina.com.cn/s/blog_66a61f310100i7m0.html

MSB:Most Significant Bit  ------- 最高有效位
    LSB:Least Significant Bit ------- 最低有效位

  大端模式(big-edian)
  big-endian:MSB存放在最低端的地址上。

舉例,雙位元組數0x1234以big-endian的方式存在起始地址0x00002000中:

        | data |<-- address
        | 0x12 |<-- 0x00002000
        | 0x34 |<-- 0x00002001

  在Big-Endian中,對於bit序列中的序號編排方式如下(以雙位元組數0x8B8A為例):

        ----+---------------------------------------------------+
        bit | 00 01 02 03 04 05 06 07 | 08 09 10 11 12 13 14 15 |
        ----+MSB---------------------------------------------LSB+
        val |  1  0  0  0  1  0  1  1 |  1  0  0  0  1  0  1  0 |
        ----+---------------------------------------------------+
        = 0x8B8A

  小端模式(little-endian)

  little-endian:LSB存放在最低端的地址上。

  舉例,雙位元組數0x1234以little-endian的方式存在起始地址0x00002000中:

        | data |<-- address
        | 0x34 |<-- 0x00002000
        | 0x12 |<-- 0x00002001

  在Little-Endian中,對於bit序列中的序號編排和Big-Endian剛好相反,其方式如下(以雙位元組數0x8B8A為例):

        ----+---------------------------------------------------+
        bit | 15 14 13 12 11 10 09 08 | 07 06 05 04 03 02 01 00 |
        ----+MSB---------------------------------------------LSB+
        val |  1  0  0  0  1  0  1  1 |  1  0  0  0  1  0  1  0 |
        ----+---------------------------------------------------+
        = 0x8B8A

c) 網路位元組序:TCP/IP各層協議將位元組序定義為Big-Endian,因此TCP/IP協議中使用的位元組序通常稱之為網路位元組序。

 

網路位元組順序是“所見即所得 (WYSIWYG)”的順序。而Intel類型的CPU的位元組順序與此相反。

比如上面的 short B=0102H(十六進位,每兩位表示一個位元組的寬度)。所見到的是“0102”,按一般數學常識,數軸從左至右的方向增加,即記憶體位址從左至右增加的話,在記憶體中這個 short B的位元組順序是:

01 02

這就是網路位元組順序。所見到的順序和在記憶體中的順序是一致的!

     在ARM體系中,每個字單元包含4個位元組單元或者兩個半字單元。在字單元中,4個位元組哪一個是高位位元組,哪一個是低位位元組則有兩種不同的格式:big-endian和little-endian格式。在小端模式中,低位位元組放在低地址,高位位元組放在高地址;在大端模式中,低位位元組放在高地址,高位位元組放在低地址。

在C語言中,不同於結構體,共用體(聯合體)中的幾種不同類型的變數存放在同一段記憶體單元中。利用這一特點,可以用聯合體變數判斷ARM或x86環境下,儲存系統是是大端還是小端模式。

#include "stdio.h"
int main()
{
  union w
 {
  int a;  //4 bytes
  char b; //1 byte
 } c;
  c.a=1;
  if (c.b==1)
  printf("It is Little_endian!\n");
  else
  printf("It is Big_endian!\n");
  return 1;
}
說明:
1  在c中,聯合體(共用體)的資料成員都是從低地址開始存放。
2  若是小端模式,由低地址到高地址c.a存放為0x01 00 00 00,c.b被賦值為0x01;

  ————————————————————————————

   地址 0x00000000 0x00000001 0x00000002 0x00000003

   c.a  01         00         00         00

   c.b  01         00        

  ————————————————————————————  
3  若是大端模式,由低地址到高地址c.a存放為0x00 00 00 01,c.b被賦值為0x0;

  ————————————————————————————

   地址 0x00000000 0x00000001 0x00000002 0x00000003

   c.a  00         00         00         01

   c.b  00         00                 

  ————————————————————————————  


4  根據c.b的值的情況就可以判斷cpu的模式了,現在XP環境下的intel CPU是小端模式,不信你可測試下!

 

的確判別一個 系統 是大頭序還是小頭序的方法是有的。 
比如: 
-BEGIN- 
int x=1; // 0x00000001 
if (*(char*)&x) { 
/* little endian. memory image 01 00 00 00 */ 
}else{ 
/* big endian. memory image 00 00 00 01 */ 

-END- 
記憶體資料(0x00000001)-〉大頭/小頭字元序-〉數值(1) 
這裡判別的前提條件是知道記憶體資料及所對應的數值,所以可以判定出大小頭字元序。   

 

另外參考:http://www.cnblogs.com/wxxweb/archive/2011/06/28/2092108.html
參考:大小端轉換函式 http://blog.csdn.net/ysdaniel/article/details/6772392

【轉】如何判斷CPU是大端還是小端模式

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.