C/C++之大端模式和小端模式
Byte Endian是指字節在內存中的組織,所以也稱它為Byte Ordering或Byte Order。對于數據中跨越多個字節的對象, 我們必須為它建立這樣的約定:
(1) 它的地址是多少?
(2) 它的字節在內存中是如何組織的?
對于跨越多個字節的對象,一般它所占的字節都是連續的,它的地址等于它所占字節最低地址。(鏈表可能是個例外, 但鏈表的地址可看作鏈表頭的地址)。比如: int x,它的地址為0×100。那么它占據了內存中的0x100, 0×101, 0×102, 0×103這四個字節(32位系統,int占用4個字節)。
上面只是內存字節組織的一種情況,多字節對象在內存中的組織一般有兩種約定。 例如一個W位的整數,它的各位表達如下:[Xw-1, Xw-2, ... , X1, X0],它的MSB(Most Significant Byte)為 [Xw-1, Xw-2, ... Xw-8];LSB (Least Significant Byte)為 [X7,X6,..., X0]。LSB和MSB誰位于內存的最低地址,即誰代表該對象的地址,這就引出了大端(Big Endian)與小端(Little Endian)的問題
32位寬的數0x12345678在小端模式CPU內存中的存放方式(假設從地址0x4000開始存放)為:
內存地址 | 0x4000 | 0x4001 | 0x4002 | 0x4003 |
存放內容 | 0x78 | 0x56 | 0x34 | 0x12 |
而在大端模式CPU內存中的存放方式則為:
內存地址 | 0x4000 | 0x4001 | 0x4002 | 0x4003 |
存放內容 | 0x12 | 0x34 | 0x56 | 0x78 |
首先我們要知道一點,內存地址是從小到大順序增長的。因此,如果定義一個變量,變量的地址就是0x4000。采用大端方式進行數據存放符合人類的正常思維,而采用小端方式進行數據存放利于計算機處理。下面通過程序判斷大小端
聯合體測試大端小端
使用指針強制轉換
與50位技術專家面對面20年技術見證,附贈技術全景圖總結
以上是生活随笔為你收集整理的C/C++之大端模式和小端模式的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Visual Studio 2017中的
- 下一篇: C/C++之Gcc常用参数