標籤:
原文網址: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是大端還是小端模式