程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> 大端小端影響位域的存放,大端存放

大端小端影響位域的存放,大端存放

編輯:C++入門知識

大端小端影響位域的存放,大端存放


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。

image


大端存儲法與小端存儲法有什不同

大端模式就是低位存放在高地址上。高位存放在地址上。
小端模式就是地位存放在低地址上。高位存放在高地址上。

例如,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中的存儲格式與之相反。
 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved