簡單點說,就是位元組的儲存順序,如果資料都是單位元組的,那怎麼儲存無所謂了,但是對於多位元組資料,比如int,double等,就要考慮儲存的順序了。注意位元組序是硬體層面的東西,對於軟體來說通常是透明的。再說白一點,位元組序通常只和你使用的處理器架構有關,而和程式語言無關,比如常見的intel x86系列就是小端序。
資料的高位位元組存放在位址的低端 低位位元組存放在位址高階
資料的高位位元組存放在位址的高階 低位位元組存放在位址低端
位元組的高位與低位
舉個例子,int a = 0x12345678 ; 那麼左邊12就是高位位元組,右邊的78就是低位位元組,從左到右,由高到低,(注意,高低乃相對而言,比如56相對於78是高位元組,相對於34是低位元組)
位址的高階與低端
0x00000001
0x00000002
0x00000003
0x00000004
從上倒下,由低到高,位址值小的為低端,位址值大的為高階。
看看兩種方式如何儲存資料,假設從位址0x00000001處開始儲存十六進製制數0x12345678,那麼
bit-endian 如此存放(按原來順序儲存)
0x00000001 -- 12
0x00000002 -- 34
0x00000003 -- 56
0x00000004 -- 78
little-endian 如此存放(顛倒順序儲存)
0x00000001 -- 78
0x00000002 -- 56
0x00000003 -- 34
0x00000004 -- 12
乙個很好的記憶方法是,大端序是按照數字的書寫順序進行儲存的,而小端序是顛倒書寫順序進行儲存的。
方法一
bool開啟vs的記憶體視窗,看一下a的儲存方式,一目了然isbigendian()
由於a是int,所以佔四個位元組,其值是00000001,儲存方式如下。所以a[3]是0,不是大端序。乙個更標準的寫法是將a[3]替換為a[sizeof(int) - 1]。
0x0012fe88 01
0x0012fe89 00
0x0012fe8a 00
0x0012fe8b 00
方法二,使用union,原理見後面的面試題。
bool來道題鞏固一下,下面**輸出什麼?isbigendian()
c; c.a =0x0102
;
if(c.b ==1
)
return
true
;
else
return
false
;}
union u這個題,要看你使用的是什麼系列的cpu,姑且假設是intel系列的。union是乙個特殊的結構,其中所有成員共享結乙個記憶體位址,任意時間只能儲存乙個成員,上面的union大小為4個位元組,所以上面的**儲存完字元1和2之後,union的儲存貌似應該是0x31320000,31和32分別是字元'1'和'2'的十六進製制ascii碼(注意是字元1和2,而不是整數),但是intel系列的cpu都是按照小端序儲存的,所以,正確的順序是0x00003231,對應的十進位制數是12849,你答對了麼?a ;int main(void
)
大端序與小端序
簡單點說,就是位元組的儲存順序,如果資料都是單位元組的,那怎麼儲存無所謂了,但是對於多位元組資料,比如int,double等,就要考慮儲存的順序 了。注意位元組序是硬體層面的東西,對於軟體來說通常是透明的。再說白一點,位元組序通常只和你使用的處理器架構有關,而和程式語言無關,比如常見的 intel ...
大端序與小端序
簡單點說,就是位元組的儲存順序,如果資料都是單位元組的,那怎麼儲存無所謂了,但是對於多位元組資料,比如int,double等,就要考慮儲存的順序了。注意位元組序是硬體層面的東西,對於軟體來說通常是透明的。再說白一點,位元組序通常只和你使用的處理器架構有關,而和程式語言無關,比如常見的intel x8...
大端序小端序
摘自 linux核心程式設計 比如看這個 十六進製制數0x12345678的表示 32位大端序表示 1234 56780 8 1624 32位小端表示 7856 341208 1624 備註 0x12345678中 12 是高位,78是低位。x86體系結構是用小端序。程式設計檢視自己電腦是大端還是小...