在操作系統(tǒng)中诗赌,一個(gè)內(nèi)存單元大小為8bit汗茄,也就是1byte。每個(gè)內(nèi)存單元都有它的邏輯地址铭若,64位編譯環(huán)境下剔难,地址占用,但由于系統(tǒng)限制奥喻,其實(shí)只用到了48位偶宫,所以經(jīng)常會(huì)看到打印一個(gè)指針,出現(xiàn)的值是一個(gè)小于等于48位長(zhǎng)度的十六進(jìn)制值环鲤,但存儲(chǔ)這個(gè)指針仍占用64位(8bytes)的內(nèi)存空間纯趋。
int i = 254;
int * p = &i;
printf("%p\n",p); //打印指針p保存的地址值
printf("%d\n",siezeof(p)); //打印指針p所需要的內(nèi)存大小
打印結(jié)果為0x7ffc8e034154和8。
如果一個(gè)存儲(chǔ)對(duì)象所需要存儲(chǔ)的空間能被一個(gè)內(nèi)存單元(1byte)容納冷离,那么就能直接存入一個(gè)內(nèi)存單元中吵冒,比如:char類型的數(shù)據(jù)對(duì)象。
如果一個(gè)存儲(chǔ)對(duì)象所需要的存儲(chǔ)空間大于1byte西剥,那么它將會(huì)被連續(xù)地存儲(chǔ)在多個(gè)內(nèi)存單元中痹栖。這個(gè)時(shí)候就要分大端和小端的字節(jié)序列存儲(chǔ)方式。
聲明一個(gè)32位無(wú)符號(hào)整型變量瞭空,它存儲(chǔ)時(shí)需要占據(jù)4個(gè)內(nèi)存單元揪阿。
uint32_t num = 1261859
num的二進(jìn)制表示為00000000 00010011 01000001 00100011
num的十六進(jìn)制表示為0x00134123
它的大小端存儲(chǔ)方式表示如下:
大端
順序存儲(chǔ)對(duì)象的最高有效字節(jié)(注意是字節(jié))存儲(chǔ)在該內(nèi)存段的最低地址中疗我,最低有效字節(jié)存儲(chǔ)在內(nèi)存段的最高地址中。如圖0x00134123在內(nèi)存單元中的小端存儲(chǔ)示意:
內(nèi)存地址0x101是4個(gè)內(nèi)存單元中的最低地址處南捂。0x104是4個(gè)內(nèi)存單元中的最高地址處吴裤。
根據(jù)權(quán)重比可知,00000000是最高有效字節(jié)(注意是字節(jié)溺健,8位)麦牺,00100011是最低有效字節(jié),也就是說(shuō)十六進(jìn)制表示法中00是最高有效字節(jié)鞭缭,23是最低有效字節(jié)剖膳,因此按從高字節(jié)到低字節(jié)順序存儲(chǔ),會(huì)出現(xiàn)以上結(jié)果岭辣。這就是大端法吱晒。
小端
小端法和大端法截然相反,最高有效字節(jié)儲(chǔ)存在該段內(nèi)存的最低地址處易结,最低有效字節(jié)存儲(chǔ)在最高地址處枕荞。結(jié)果如圖:
常用的操作系統(tǒng)中柜候,linux和windows是小端法來(lái)存儲(chǔ)數(shù)據(jù)對(duì)象的搞动。
那么如何查看自己的操作系統(tǒng)是用的大端還是小端法來(lái)存儲(chǔ)數(shù)據(jù)對(duì)象的呢?
可以用一個(gè)簡(jiǎn)單的c程序或者其他程序來(lái)實(shí)現(xiàn)驗(yàn)證渣刷,我這里用c程序做例子:
#include <stdio.h>
#include <stdint.h>
int main(){
uint32_t num = 1261859;
unsigned char * order = (unsigned char *)# //將num的首地址賦值給order作為無(wú)符號(hào)字符數(shù)組的首地址
for (int i = 0; i < 4; ++i) {
printf("%#.2x\t",order[i]);
printf("%p\n",order+i);
}
}
我的操作系統(tǒng)是linux deepin 64位鹦肿,打印結(jié)果如下:
證明它用的小端法來(lái)存儲(chǔ)數(shù)據(jù)對(duì)象。
注意:網(wǎng)絡(luò)字節(jié)序列都是大端法表示辅柴。