位序、字节序、类型序
計算機學科中的很多問題,都是因為概念的抽象模糊,導致理解上的不確定性,增加學習領悟的難度。對于計算機中數據存放次序的問題,很多教材或文章要么含糊其辭,要么憑空飛來結論,讓人看的一頭霧水。幾經周折,結合多篇文章,對內存中數據存放次序終于有了較深入的理解,現記錄如下:
一、幾個概念:
????????1.內存中關于數據的存放順序有三個層次(即三種不同的視角):
?????????????????????1.位序(以一位即bit為單位)-------字節內的bit位與bit位之間的先后順序
?????????????????????2.字節序(以一字節為單位)-------某類型的字節與字節之間的先后順序
?????????????????????3.類型序(以若干字節構成的某種類型為單位)-------類型之間的先后順序
???????2.內存的擴展方向:
??????????????1.遞增地址:存放數據時, 自低地址向高地址依次存放, 例如棧
??????????????2.遞減地址:存放數據時, 自高地址向低地址依次存放, 例如堆
?????????????????????題外話:Linux系統中,用虛擬內存映射到物理內存的方式來管理內存空間。操作系統占用的內存空間稱為系統空間, 用戶程序占用的空間稱為用戶空間,在用戶空間中,有棧和堆,兩塊內存區是連在一起 ,但是棧是地址遞增,堆是地址。
????????3.大端模式與小端模式
?????????????????????????????????12345678
????????????????????????????左????<------->??????右
??????????????看上面的數字順序,我們可以從右向左讀87654321,也可以從左向右讀12345678,那么計算機也一樣,在讀入這串數據時(即將這串數據裝入內存),它也可以按從右向左或從左向右的順序讀入
??????????????小端法;即計算機讀入這串數據時,是按照從右向左的順序,依此將87654321存放到內存的
??????????????大端法:即計算機讀入這串數據時,是按照從左向右的順序,依此將12345678存放到內存的
弄明白了大小端模式,下面我們來結合前面地址增長方向和位序、字節序來看看,內存中的數據到底是怎么來存放的
二、內存中數據的真實存放次序
1.地址遞增情況
(1)位序
以二進制10110101(B)為例:左------>10110101<-------右
小端模式:按位,自右向左依次將1 0 1 0 1 1 0 1存放在0地址單元中的第0位到第7位;
大端模式:按位,自左向右依次將1 0 1 1 0 1 0 1存放在0地址單元中的第0位到第7位;
(2)字節序
? ? ? ? ? ? 以十六進制數0x12345678(12、34、56、78分別各自構成一個字節,由于以字節為單位,故將忽略字節內的位序))為例:?左------->0x12 34 56 78<-------右 ????????????????????????????????????????????
? ? ? ? ? ? 小端模式:按字節, 自右向左依次將78 56 34 12這四個字節存放在自0地址開始的4個內存單元(每個單元存放一個字節)中;
? ? ? ? ? ? 大端模式:按字節, 自左向右依次將12 34 56 78這四個字節存放在自0地址開始的4個內存單元(每個單元存放一個字節)中;
(3)綜合字節序與位序
? ? ? ? ? ? 可見無論是位序還是字節序, 小端模式總是自右向左的讀取數據,而大端模式總是自左向右的讀取數據, 區別僅在于是按位還是按字節。遞減情況:
? ? ? ? ? ? ?小端模式:將數據自右向左依次逐位或逐字節地填入到自高地址開始逐漸遞減的內存中;
? ? ? ? ? ? ? 大端模式:將數據自左向右依次逐位或逐字節地填入到自高地址開始逐漸遞減的內存中;
? ? ? ? ? ? ? 【ps】:很多教材或文章中,總用低地址,高地址和低字節、高字節做區分和記憶,實際這樣很不方便記憶,而且也不易理解,同時,只適用棧這樣的地址遞增的情況,而不適用于堆這種內存遞減的情況,因此本文章棄用這種方法,只按數據書寫格式的自左向右與自右向左來區分大端模式與小端模式,方便記憶和理解。
三、結構體中各數據類型內存存放次序與位域
1.結構體中各類型元素,按其聲明的先后順序,依次存放。
???????????????例如:下面的結構體,對于內存遞增情況,自低地址向高地址依此存放abc? ? ? ?
struct? data?{int?a;short?b; char?c;}
2.位域:指定變量占用幾位bit位
???????????????例如:下面結構體中,int型的a只占用3位bit, short型的b占用9位bit, 而char型的c占用4位bit,整個結構體共占用16位,即共占用兩個字節。
四、函數參數入棧
??????1.一般可以通過宏命令指定參數入棧方式:參數自右向左逐個依次入棧,還是自左向右依次入棧。一般默認參數入棧方式為自右向左,例如:函數add(int a, int b);其參數入棧次序按默認為自右向左依次入棧,即b先入棧,然后a再入棧。
?????2.入棧的位序與字節序
? ? ? (1)入棧的位序
? ? ? ? ? ? ?以long long型十進制數1427195721448768429為例
? ? ? ? ? ? ?無論大/小端模式,其入棧的次序都是相同:對于一塊內存上的數據:
? ? ? ? ? ? ?入棧順序:最高地址所對應的字節中的最高位最先入棧, 然后是最好字節中的次高位入棧,…, 最后是最低地址所對應的字節中的最低位入棧;
? ? ? ? ? ? ?出棧順序:棧頂字節中的最高位彈出到最低地址所對應的字節中的最低位, …棧底字節中最低位彈出到最高地址所對應的最高位;
? ? ? ? ? ? ? ?這樣設計入棧順序,是為了出棧后的順序與入棧前的順序保持一致。
? ? ? ? (2)入棧的字節序
? ? ? ? ? ? ? ?由入棧的位序可知,入棧的字節序為:對于一塊內存上的數據
? ? ? ? ? ? ? ?入棧順序:最高地址對應的字節先入棧,然后第二高地址對應的字節入棧,...,最后最低地址對應的字節最后入棧;
? ? ? ? ? ? ? ?出棧順序:棧頂字節彈出到最低地址對應的字節, ..., 棧底字節彈出到最高地址對應的字節;
?????3.入棧字節數限制
? ? ? ? ? 一般入棧的字節數為一個機器字長(32位機為4字節), 對于大于4字節的類型,如long long其入棧情況前面已經討論過,無論是大端模式,還是小端模式,即其最高地址對應的字節先入棧, ..., 最低地址對應的字節最后入棧, 而字節內部最高位最先入棧, 最低位最后入棧。
對于小于4字節的類型, 如char和short在入棧時, 將其按低地址對齊,如果是無符號數, 則在其后補的高地址對應的字節內補0, 例如char型的0x12只占用1個字節, 為將其補全為4個字節,可在其后遞增的地址上補上3個字節的0,?如果是有符號位, 則在其后補的高地址對應的字節內補符號位, 例如short型的-25只占用2個字節, 為將其補全為4個字節,可在其后遞增的地址上補上2個字節的1(-25的符號位是負的,因此補1)。
---------------------?
原文:https://blog.csdn.net/prograc/article/details/52666266?
?
總結
以上是生活随笔為你收集整理的位序、字节序、类型序的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 上海欢乐谷上海滩表演时间
- 下一篇: 冷媒多少钱啊?