在計算機內存中,通常是以字節(Byte),也就是 8 個位(Bit)爲基本存儲單元(也有以 16 位爲基本存儲單元的)。對於像C++中的char這樣的數據類型,它本身就是佔用一個字節的大小,不會產生什麼問題。但是當數制類型爲int,在32bit的系統中,它需要佔用4個字節(32bit),這個時候就會產生這4個字節在寄存器中的存放順序的問題。比如int maxHeight = 0x12345678,&maxHeight = 0x0042ffc4。具體的該怎麼存放呢?這個時候就需要理解計算機的大小端的原理了。
大端:(Big-Endian):
就是把數值的高位字節放在內存的低位地址上,把數值的地位字節放在內存的高位地址上。
小端:(Little-Endian):
就是把數字的高位字節放在高位的地址上,低位字節放在低位地址上。
【注】不管是大端法還是小端法存儲,計算機在內存中存放數據的順序都是從低地址到高地址,所不同的是首先取低字節的數據存放在低地址還是取高字節數據存放在低地址。
大端法和小端法指的是字節在內存中存儲時的排列規則,而不是數據中的位的排列規則。也有以位序排列的機器,但很少見。另外,再次明確一下,大端法或小端法是數據在存儲時的表現,而不是在寄存器中參與運算時的表現。
我們常用的x86結構都是小端模式,而大部分DSP,ARM也是小端模式,不過有些ARM是可以選擇大小端模式。所以對於上面的maxHeight是應該以小端模式來存放,具體情況請看下面兩表。
(1)小端規則
地址 | 0x0042ffc4 | 0x0042ffc5 | 0x0042ffc6 | 0x0042ffc7 |
---|---|---|---|---|
數值 | 0x78 | 0x56 | 0x34 | 0x12 |
(2)大端規則
地址 | 0x0042ffc4 | 0x0042ffc5 | 0x0042ffc6 | 0x0042ffc7 |
---|---|---|---|---|
數值 | 0x12 | 0x34 | 0x56 | 0x78 |
通過上面的表格,可以看出來大小端的不同。(注:其實在計算機內存中並不存在所謂的數據類型,比如char,int等的。這個類型在代碼中的作用就是讓編譯器知道每次應該從那個地址起始讀取多少位的數據,賦值給相應的變量。)