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