linux分析字节序的分类及特点,计算机中的字节序详解 分类: 【Linux/Windows操作系统】 2015-01-07 21:54 97人阅读 评论(0) 收藏...
我們都知道,內(nèi)存中存儲的是各種變量,各種奇葩東西,不用的變量占用不用的字長,例如在intel X86環(huán)境下,一個int占用兩個字
0
1
2
3
4
5
6
7
8
9
0x30
0x31
0x32
0x33
0x34
0x35
0x36
0x37
0x38
0x39
節(jié),即16位。然后在這16位上用0或1來表示這個int類型的變量到底是什么數(shù)值。那么這樣就有兩種寫法了,在這16位上是從左往右寫呢,還是從右往左寫呢。這就好比現(xiàn)代人寫字從左往右,古人寫字從右往左。根據(jù)這樣兩種不同的寫法,計(jì)算機(jī)中就產(chǎn)生了兩種模式:小端模式和大端模式。具體來看一個例子:
假設(shè)在intel X86環(huán)境下,有一個數(shù)字,是1539,用二進(jìn)制就表示為:0000 0110 0000 0011(兩個字節(jié))
高八位
低八位
0000 0110
0000 0011
既然計(jì)算機(jī)以字節(jié)為單位,如果這里的一個字節(jié)相當(dāng)于寫一個漢字的話,那這個1539在計(jì)算機(jī)內(nèi)部就相當(dāng)于要寫兩個漢字。怎么寫呢,不著急,先介紹
小端模式:按照從低地址到高地址的順序,依次存放數(shù)據(jù)的低字節(jié)到高字節(jié)。
高八位
低八位
小端模式:
0000 0110
0000 0011
插入一句:一個數(shù)的原數(shù),是高字節(jié)在左,低字節(jié)在右,當(dāng)然是這樣,因?yàn)樽筮叺臋?quán)值高,2的次方高。學(xué)習(xí)本篇的時候,要始終記住吧一個個字節(jié)作為一個個單位,而不要著眼于位。
我這里高八位標(biāo)在左邊,低八位標(biāo)在右邊,很多地方低八位標(biāo)左,高八位標(biāo)右,這個其實(shí)是完全一樣的,怎么看得舒服就怎么寫。
按照定義,低地址放低字節(jié),高地址放高字節(jié),所以低八位放1539的低字節(jié),高八位放1539的高字節(jié)。
接下來是
大端模式:按照從低地址到高地址的順序,依次存放數(shù)據(jù)的高字節(jié)到低字節(jié)。
高八位
低八位
大端模式:
0000 0011
0000 0110
現(xiàn)在再回頭看看,不過就是正著寫反著寫而已。╮(╯_╰)╭
一般來說,x86 系列 CPU 都是小端模式的字節(jié)序,PowerPC 通常是大端模式字節(jié)序,還有的CPU能通過跳線來設(shè)置CPU工作于小端模式還是大端模式模式?;旧弦疾於际莍ntel x86 x64環(huán)境,都是小端模式,不會那么坑考冷門的大端模式。。
練習(xí):
0x1234abcd
低地址 ?? ? ? ? ? ? 高地址
小端模式:0xcd? 0xab? 0x34? 0x12
大端模式:0x12? 0x34? 0xab? 0xcd
寫出下列程序的執(zhí)行結(jié)果
#include
main()
{
char*sz="0123456789";
int*p=(int*)sz;
printf("%x\n",*++p);
}
答案是37363534
'0'
'1'
'2'
'3'
'4'
'5'
'6'
'7'
'8'
'9'
0x30
0x31
0x32
0x33
0x34
0x35
0x36
0x37
0x38
0x39
int *p = (int*)sz; 這句話的意思是說把這塊內(nèi)存當(dāng)做int來對待??梢赃@樣理解,數(shù)據(jù)就在內(nèi)存中擺著,就看你當(dāng)成什么來用了。
不管32位還是64位,int都占四個字節(jié),printf那邊有個++p,這個p是int型的指針,所以按照int的大小走四個字節(jié)
即現(xiàn)在p指向的是:
'0'
'1'
'2'
'3'
'4'
'5'
'6'
'7'
'8'
'9'
0x30
0x31
0x32
0x33
0x34
0x35
0x36
0x37
0x38
0x39
這塊內(nèi)存區(qū)域。還記得嗎,用的是小端模式,那這個int變量該怎么寫?
很明顯是:0x37363534(低地址存低字節(jié))
所以用%X輸出的話就看到了37363534這個結(jié)果了。
寫出下列程序執(zhí)行結(jié)果
inta=0x12345678;
char*p=(char*)(&a);
printf("%x\n",*(p+1));
答案是0x56
判斷計(jì)算機(jī)是大端還是小端:
inti=1; char*p=(char*)&i; if(*p==1) printf("小端模式"); else// (*p == 0) printf("大端模式");
總結(jié)
以上是生活随笔為你收集整理的linux分析字节序的分类及特点,计算机中的字节序详解 分类: 【Linux/Windows操作系统】 2015-01-07 21:54 97人阅读 评论(0) 收藏...的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux中facl有什么作用,在Lin
- 下一篇: flash player for lin