高地址和低地址、高字节低字节、大小端模式的转换,存储顺序
參考博客
https://blog.csdn.net/ce123_zhouwei/article/details/6971544
https://my.oschina.net/alphajay/blog/5478
一、高地址和低地址
?
二、高字節低字節
如int a=16777220,化為十六進制是0x01?00 00 04則04屬于低字節,01屬于高字節
?
三、大小端模式
(1)如果a在內存中的存放順序為下圖(即低字節存放在高地址),則為大端模式
(2)如果a在內存中的存放順序為下圖(即低字節存放在低地址),則為小端模式
(3)如何互換(通過移位操作再或)
四、存放順序
1、原則
(1)一個整數類型內部
低地址存儲低位,高地址存儲高位。比如int a=1,則存儲情況為0000(高地址) 0000 0000 0001(低地址)
(2)若干個局部變量(在棧中存儲的)
先定義的高地址,后定義的低地址
(3)類、結構體或數組的元素
先定義的低地址,后定義的高地址
?
五、測試說明
(1)整數類型內部:低地址存儲低位,高地址存儲高位。
#include<iostream> using namespace std;union U {char str[2];short int num; };int main() {U u;u.str[0] = 10;//存放在低地址,0000 1010u.str[1] = 1;//存放在高地址, 0000 0001cout << u.num << endl;//組合的時候,整數類型內部低地址存儲低位,高地址存儲高位,因此是0000 0001 0000 1010 = 266system("PAUSE");return 0; }(2)若干個局部變量(在棧中存儲的):先定義的高地址,后定義的低地址。
類、結構體、數組中的元素:先定義的低地址,后定義的高地址
class Test { public:int m;int n; }; int main() {int a;char b;int c[10];Test t;cout << (size_t)&a << endl;//結果1cout << (size_t)&b << endl;//結果2cout << (size_t)&c << endl;//結果3cout << (size_t)&t << endl;//結果4cout << (size_t)&t.m << endl;//結果5cout << (size_t)&t.n << endl;//結果6system("PAUSE");return 0; }結果1>結果2>結果3>結果4=結果5<結果6
分析:
結果1>結果2>結果3>結果4,是因為a、b、c、t都是局部變量,在棧上存儲,棧是從高地址到低地址,因此地址逐漸減小。
結果5<結果6,是因為結構體內部,先定義的地址小,后定義的地址大,這與類內的成員,數組總的元素,都是類似的。? ????
分析它們的數值差,可以發現字節對齊問題,數組名占用4字節等問題。
總的來說,具體的地址,需要考慮“棧的高地址到低地址”、“字節對齊”、“數組”這樣的特殊情況等等。
?
總結
以上是生活随笔為你收集整理的高地址和低地址、高字节低字节、大小端模式的转换,存储顺序的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Anaconda下载安装Pytorch遇
- 下一篇: C语言函数的递归