字節順序是指占內存多於一個字節類型的數據在內存中的存放順序,通常有小端、大端兩種字節順序。
小端字節序指低字節數據存放在內存低地址處,高字節數據存放在內存高地址處;
大端字節序是高字節數據存放在低地址處,低字節數據存放在高地址處。
高、低字節
一般PC是低字節序,如果按平時書寫習慣,從左到右是高位到地位的順序,則例如0X12345678,在內存中的情況是
高地址
12
34
56
78
低地址
高地址:內存地址可以對應十六進制的數值,值大的為高地址,否則為低地址;
3. 總結
整數類型內部:低地址存儲低位,高地址存儲高位。
局部變量:先定義的高地址,后定義的低地址。
類,結構體,數組:先定義的低地址,后定義的高地址。
數組實際占用的空間,要比元素大,感覺上像是給數組名本身一個“指針類型”的空間,即4個字節。
intel處理器 小端模式
TCP/IP 大端模式
{http://yixiangongzhu.blog.163.com/blog/static/1973632032011111545140752/}
1. 下面程序輸出是多少?
Union U {
char str[2];
short int num;
};
int main() {
U u;
u.str[0] = 10;
u.str[1] = 1;
cout << u.num << endl;
system("PAUSE");
return 0;
}
結果為266。對於整數類型,都是低字節存低位,高字節存高位,因此低位是10,高位是1,結果=1*256+10=266。
2. 下面不同變量之間地址大小關系
class Test {
public:
int m;
int n;
};
int main() {
int a;
char b;
int c[10];
Test t;
cout << (size_t)&a << endl;
cout << (size_t)&b << endl;
cout << (size_t)&c << endl;
cout << (size_t)&t << endl;
cout << (size_t)&t.m << endl;
cout << (size_t)&t.n << endl;
system("PAUSE");
return 0;
}
(size_t)&a > (size_t)&b > (size_t)&c > (size_t)&t.n > (size_t)&t.m = (size_t)t
2293612 > 2293611 > 2293552 > 2293548 > 2293544 = 2293544
a、b、c、t都是局部變量,在棧上存儲,棧是從高地址到低地址,因此地址逐漸減小。結構體內部,先定義的地址小,后定義的地址大,這與類內的成員,數組總的元素,都是類似的。
此外,值得注意的是(size_t)&a-(size_t)&b=1,剛好是1個字節,即b的大小。(size_t)& b-(size_t)&c=59,這是因為首先需要字節對齊,補3個字節,從2293611,補到2293608,從2293607到 2293552剩下的44個字節是數組占用,注意數組只有10個元素是40個字節,還有4個字節應該是數組名占用的,把數組名看作一個指針?或者是數組名本身包含數組長度的信息,具體情況不是很清楚,不過int a[10]占用的空間是44個字節,而10個int類型的變量占用40個字節。t的字節分配很簡單,沒有什么了。
總的來說,具體的地址,需要考慮“棧的高地址到低地址”和“字節對齊”以及“數組”這樣的特殊情況等等。