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