1 示例代碼
對于以下代碼:
int main()
{int a = 100010001000;int b = 100;cout << "a = " << a << " " << &a << endl;cout << "b = " << b << " " << &b << endl;system("pause");return 0;
}
輸出結果為:
2 設置斷點調試
下面我們使用斷點調試技術,在結束前打上斷點,以便于我們查看內存
- 按F9打上斷點
- 再按F5進行調試
- 再按回車
得到以下結果
3.1 注意事項
打了斷點的含義是:該行不會被執行,在其之前的會被執行
對于上圖,13行不會被執行,13行(不包含)之前的會被執行。
3 查看內存
然后做如下操作,以查看內存:
設置字節顯示情況,對于int來說,這里是4個字節的,選擇4,觀察可以得到:地址的連續性也是不斷+4的
這里涉及到一個引申的知識點,重點強調一下
4 內存查看方式分析
我們觀察到對于int a = 100;在內存上顯示是這樣的
它采用十六進制來顯示,這是為了方便人類查看,當然,十六進制的發明還有很多原因和應用,這里不再擴展。
每兩個十六進制位,就是一個字節,因此上面是兩兩顯示的,但是值得注意的是,這種四字節查看方式,實際上,00 00 00的地址只是隱藏了而已,讓我們使用單字節查看方式,你就瞬間明白了
事實上,單字節的查看方式,更加符合內存的存儲單元的實際情況。
這里要尤為注意
- 地址越大,權重越高,也就是下面的是高字節,上面的是低字節
5 建立關聯:匯編語言
我們來回看一下**《匯編語言》**中的內存情況,進一步闡述。
5.1 基本單位為字節的情況
一個存儲單元,對應8個二進制位,2個十六進制位
存儲單元的編號,也就是內存地址
5.2 基本單位為二進制位的情況
甚至,對于二進制位的描述,也是自上而下權重升高的
不過值得說明的是,這只是一種通用的習慣,并不是強制性的,與實際硬件的實現方式也關系不大。
6 擴展閱讀
【擴展材料】
- 大端序與小端序1
- 大端序與小端序2
在此鏈接我再補充一點:我們常用的,比如十進制的8,表示為0000_1000,這就是小端序
0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 |
---|
按照標準,小端序:數據的高位字節存放在地址的高端 低位字節存放在地址低端
這一點也印證了上述第五節的觀點,高位地址的權重更大
低地址 | 0x0015F740 | 98 |
---|---|---|
↓ | 0x0015F741 | AB |
↓ | 0x0015F742 | B8 |
↓ | 0x0015F743 | 9A |
↓ | 0x0015F744 | 10 |
↓ | 0x0015F745 | 22 |
↓ | 0x0015F746 | FB |
高地址 | 0x0015F747 | 00 |
7 疑問
問題1:在地址0x0015F741中最前面的0x是什么含義?**
在C/C++中,0x或0X代表十六進制的前綴,這也就解釋了為什么后面的用十六進制表示的地址。
在java7以后,有以下前綴,來代表不同的進位計數制(以下的0中間帶圓點,類似于扁的⊙)
- 二進制:0b或者0B
- 八進制:0(難區分,不常用)
- 十六進制: 0x或0X
- 十進制:不寫前綴
7.1 擴展:進位計數制的前綴和后綴
在Verilog和數字邏輯中,十六進制使用h或者H來表示
十六進制的表示有
- 前綴: 0x或0X
- 后綴: h或H
具體使用h還是0x,取決于使用環境
同理,二進制和八進制也有前綴和后綴
- 二進制
- 前綴:0b或0B
- 后綴:b或B
- 八進制 【不常用】
- 0
- o或O
對于十進制
- 沒有前綴,不寫前綴就是的十進制
- 后綴:d或D