struct Test{ unsigned short int a:5;//a1a2a3a4a5 unsigned short int b:5;//b1b2b3b4b5 unsigned short int c:6;//c1c2c3c4c5c6 };
首先排排好
低地址----高地址
a1a2a3a4a5b1b2b3b4b5c1c2c3c4c5c6
對於大端
低地址存放高位,所以內存的分布是這個樣:
|a1a2a3a4a5b1b2b3 | b4b5c1c2c3c4c5c6|
對於小端
在一個字節中低地址存放低位(比如對於b來說,低位b3b4b5就會存放在低地址)
|b3b4b5a1a2a3a4a5 |c1c2c3c4c5c6 b1b2|
首先前一個字節中,放的是b低位的bit
其次是,在一個字節中,排列在後面的b,排在a前邊,排列在b後面的c,排在b前面
我在我本機上做了一個實驗來驗證正確性:
int main() { Test test; test.a = 16; test.b = 11; test.c = 16; int i = *(short*)&test; cout<<i<<endl; return 0; }
我們可以看一下內存布局
10000 01011 010000
01110000 | 01000001
由於是小端,所以低地址存放的是高字節,因此此值為0x4170,轉換成十進制為16752。
大端模式就是低位存放在高地址上。高位存放在地址上。
小端模式就是地位存放在低地址上。高位存放在高地址上。
例如,16bit寬的數0x1234在Little-endian模式CPU內存中的存放方式(假設從地址0x4000開始存放)為:
內存地址 0x4000 0x4001
存放內容 0x34 0x12
而在Big-endian模式CPU內存中的存放方式則為:
內存地址 0x4000 0x4001
存放內容 0x12 0x34
大端小端針對多字節數據存儲時字節順序而言的。所謂"Little Endian",為INTEL所采用模式,數據的低字節存放在內存低地址中,高字節存放在高地址中,即學X86時說的“高高低低”原則。Byte3 Byte2 Byte1 Byte0在內存中對應的是:
Base Address+0 Byte0
Base Address+1 Byte1
Base Address+2 Byte2
Base Address+3 Byte3
所謂"Big Endian" ,為MOTO所采用模式,數據的低字節存放在內存的高地址,數據的高字節存放在內存的低地址。Byte3 Byte2 Byte1 Byte0在內存中對應的是:
Base Address+0 Byte3
Base Address+1 Byte2
Base Address+2 Byte1
Base Address+3 Byte0
Java使用的是大端序來存儲數據。big—endian:即低字節的數據存儲在高位內存上,如對於1234,12是高位數據,34為低位數據,則java中的存儲格式應該為12存在內存的低地址,34存在內存的高地址,x86中的存儲格式與之相反。