byte endian(biglittle endian)
1. 大小端的區(qū)別
little endian:把低位字節(jié)存放在內(nèi)存的低位; //
big endian:?? 將低位字節(jié)存放在內(nèi)存的高位;
比如:0x1234,則12 就屬于高位字節(jié);34 屬于低位字節(jié)
假如從地址0x0000 0000開始的一個字節(jié)中保存數(shù)據(jù)0x12345678, 這2中字節(jié)序在內(nèi)存當中存放順序為:
address:????? 0x0000 0000??? 0x0000 0001??? 0x0000 0002??? 0x0000 0003
big_endian? 0x12????????????? ????0x34????????? ?????? 0x56???????? ??????? 0x78
lit-endian???? 0x78??????????????? ? 0x56??????????????? ?0x34?????????????? ? 0x12
2.? 為什么會有大小端模式的區(qū)分呢?
??? 因為在計算機系統(tǒng)中,我們是以字節(jié)為單位的,每個地址單元都對應著一個字節(jié),一個字節(jié)為8bit。但是在C語言中除了8bit的char之外,還有16bit的short型,32bit的long型(要看具體的編譯器),另外,對于位數(shù)大于8位的處理器,例如16位或者32位的處理器,由于寄存器寬度大于一個字節(jié),那么必然存在著一個如果將多個字節(jié)安排的問題。因此就導致了大端存儲模式和小端存儲模式。
??? 當前的存儲器,多以byte為訪問的最小單元,當一個邏輯上的整理必須分割為物理上的若干單元時就存在了先放誰后放誰的問題,于是endian的問題應運而生了,對于不同的存儲方法,就有Big-endian和Little-endian兩個描述.
??? (這兩個術語來自于 Jonathan Swift 的《格利佛游記》其中交戰(zhàn)的兩個派別無法就應該從哪一端--小端還是大端--打開一個半熟的雞蛋達成一致。在那個時代,Swift是在諷刺英國和法國之間的持續(xù)沖突,Danny Cohen,一位網(wǎng)絡協(xié)議的早期開創(chuàng)者,第一次使用這兩個術語來指代字節(jié)順序,后來這個術語被廣泛接納了。)
3. 各種CPU支持的字節(jié)序不同
lit-endian:? x86
big_endian:? Motorola/IBM/SUM cpu
ARM 既能工作于大端也能工作于小端
所有網(wǎng)絡協(xié)議也都是采用big endian的方式來傳輸數(shù)據(jù)的。所以有時我們也會把big endian方式稱之為網(wǎng)絡字節(jié)序。
4. 怎么檢測當前的處理器屬于哪個字節(jié)序?
?a. 用VC2005 調(diào)試查看short變量在內(nèi)存中的布局,如下:
int _tmain(int argc, _TCHAR* argv[])
{
?short t = 0x1234;
?return 0;
}
?&t = 0x12ff60, t 在內(nèi)存當中的布局如下圖:
?
?
由此可見, x86 CPU 采用的是little endian.
?
?b.? 利用字節(jié)序的基本規(guī)則進行判斷
enum BYTE_ENDIAN
{
?little_endian,
?big_endian,
?unknown_error
};
BYTE_ENDIAN check_byte_endian_1()
{
?short t = 0x1234;
?char c = (*(char *)(&t));
?if (0x12 == c)
?{
??return big_endian;
?}
?else if(0x34 == c)
?{
??return little_endian;
?}
?
?return unknown_error;
}
3.
/*---------------------------------------------------------------------------
聯(lián)合體union的存放順序是所有成員都從低地址開始存放,利用該特性,
輕松地獲得了CPU對內(nèi)存采用Little-endian還是Big-endian模式讀寫
-----------------------------------------------------------------------------*/
BYTE_ENDIAN check_byte_endian_2()
{
?union test_endian
?{
??char c;
??short s;
?};
?test_endian t;
?t.s = 0x1234;
?
?if (0x12 == t.c)
?{
??return big_endian;
?}
?else if(0x34 == t.c)
?{
??return little_endian;
?}
?
?return unknown_error;
}
==================================
另外,可以參考百度百科(關鍵字:字節(jié)序):http://baike.baidu.com/view/2194385.htm 獲取更多信息。
?
?
?
?
總結(jié)
以上是生活随笔為你收集整理的byte endian(biglittle endian)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 《春雪》第十五句是什么
- 下一篇: 吃饭了下一句是什么啊?