大端序和小端序
一、概述
字節序,又稱端序,尾序,英文:Endianness。
在計算機科學領域中,字節序是指存放多字節數據的字節(byte)的順序,典型的情況是整數在內存中的存放方式和網絡傳輸的傳輸順序。Endianness有時候也可以用指位序(bit)。
大小端序跟硬件的體系結構有關,所有x86系列的pc機都是小端序,跟操作系統無關。在x86系列的pc上的solaris系統是小端序,sun sparc平臺的solaris是大端序。
大端字節序,高字節存於內存低地址,低字節存於內存高地址;小端字節序反之。
如一個long型數據0x12345678
大端字節序:
內存低地址--> 0x12
0x34
0x56
內存高地址--> 0x78
小端字節序:
內存低地址--> 0x78
0x56
0x34
內存高地址--> 0x12
二、大端序和小端序
大端序(英:big-endian)或稱大尾序。
地址增長方向 → | |||||
... | 0x0A | 0x0B | 0x0C | 0x0D | ... |
示例中,最高有效位(MSB, Most Significant Byte)是0x0A 存儲在最低的內存地址處。下一個字節0x0B存在後面的地址處。正類似於十六進制字節從左到右的閱讀順序。
數據以16bit爲單位:
地址增長方向 → | |||||
... | 0x0A0B | 0x0C0D | ... |
最高的16bit單元0x0A0B存儲在低位。
小端序(英:little-endian)或稱小尾序。
數據以8bit爲單位:
地址增長方向 → | |||||
... | 0x0D | 0x0C | 0x0B | 0x0A | ... |
最低有效位(LSB,Least Significant Byte)是0x0D 存儲在最低的內存地址處。後面字節依次存在後面的地址處。
數據以16bit爲單位:
地址增長方向 → | |||||
... | 0x0C0D | 0x0A0B | ... |
最低的16bit單元0x0C0D存儲在低位。
採用大端序的CPU和採用小端序的CPU不僅在字節上是相反的,在比特位上也是相反的。
比如0x01在內存中的存儲
大端序:內存低比特位 00000001 內存高比特位
小端序:內存低比特位 10000000 內存高比特位
比如0x00000001
大端序:內存低比特位 00000000 00000000 00000000 00000001 內存高比特位
小端序:內存低比特位 10000000 00000000 00000000 00000000 內存高比特位
三、判定方法
typedef struct tagRegion{ unsigned char region1:1; unsigned char region2:6; unsigned char region3:1; } REGION; union { REGION bb; unsigned char aa; } cc; int main( int argc, char * argv[]) { cc.bb.region1 =1; printf ( "Hello World! %d/n" ,cc.aa); //打印1表示小端,打印128表示大端。 return 0; } |
static unsigned char isBigEndian() { const unsigned short test= 0xFF00; return *((unsigned char *) &test); }; |
使用以下方式更簡潔一些:
#include <iostream> std; main( argc, **argv) { s = ; ((*(unsigned *)&s) == ) cout<<<<endl; ((*(unsigned *)&s) == ) cout<<<<endl; cout<<<<endl; ; }
原文轉自:http://www.cnblogs.com/flysnail/archive/2011/10/25/2223721.html