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