自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

你了解計算機中大端小端之分嗎?

開發(fā) 前端
大端常常用于網(wǎng)絡(luò)協(xié)議,被稱為網(wǎng)絡(luò)端序,大端用于網(wǎng)絡(luò)協(xié)議,并不意味它比小端多好,而是網(wǎng)絡(luò)的核心是通信,所以大家必須要有共同的標準,即網(wǎng)絡(luò)通信的標準化。
  • 字節(jié)序
  • 大端字節(jié)序
  • 小端字節(jié)序
  • 判斷當(dāng)前設(shè)備大端or小端?
  • 尾語

哈嘍,大家好,我是呼嚕嚕,前段時間感冒了,好久沒更新文章了,今天我們來聊聊計算機儲存方式大端小端字節(jié)序之分

在計算機中,無論上層是什么開發(fā)語言,到了最底層都是以二進制的形式存儲運算的;二進制,與我們更熟悉的十進制(由0-9這九個數(shù)字組成,逢十進一)不同的是,只有0和1兩個數(shù)字,逢二進一

如今的主流計算機,是以以儲存器為中心,存儲器是用來存放數(shù)據(jù)和程序,下面是架構(gòu)圖:

圖片圖片

存儲器 包含主存和輔存,其中主存是能直接與CPU交換信息,就是我們熟悉的內(nèi)存。

字節(jié)序

計算機以二進制的形式將數(shù)據(jù)存到內(nèi)存中,內(nèi)存的基本單位是字節(jié)Byte, 內(nèi)存以字節(jié)為單位來進行讀寫 。1Byte = 8bit(bit叫位,也叫比特,是用以描述計算機數(shù)據(jù)量的最小單位)。字節(jié)是內(nèi)存8位為一組,每組比特都會被標記一個數(shù)字,這個數(shù)字也叫地址,尋址粒度也是字節(jié)

一個字節(jié)由于8位,如果它只考慮無符號數(shù),它的表示范圍0~255;如果考慮符號,并通過補碼解決0值的問題,只能表示-128~127這個范圍;那么如果超出這個范圍,只能將多個字節(jié)連在一起來表示數(shù)值。比如C語言中char類型是1個字節(jié)的,int類型占用4個字節(jié),double類型會占用8個字節(jié)等等

那么多個字節(jié)依次存到內(nèi)存中,就會有順序,這個叫字節(jié)序Endianness,也被稱為端序,就是 大于一個字節(jié)類型的數(shù)據(jù)在內(nèi)存中的存放順序

字節(jié)序可以被分為兩類:Big-Endian大端和Little-Endian小端(這也意味著單個字節(jié)沒有大小端之分的),我們下文詳細聊聊

大端字節(jié)序

大端字節(jié)序Big-Endian:數(shù)值的高位字節(jié)存放在內(nèi)存的低地址端,低位字節(jié)存放在內(nèi)存的高地址端

本文這里以32位的數(shù)0x12345678,來舉個例子

圖片圖片

該數(shù)值,在內(nèi)存中的存儲順序是:0x12345678。大端字節(jié)序有符號數(shù)的最高位占據(jù)內(nèi)存最低地址,符號位的判定固定在第1個字節(jié)處,符號直接可以取出來,容易判斷正負;另外大端字節(jié)序更貼近從左到右的書寫方式,所以更符合我們?nèi)祟惖牧?xí)慣

大端常常用于網(wǎng)絡(luò)協(xié)議,被稱為網(wǎng)絡(luò)端序,大端用于網(wǎng)絡(luò)協(xié)議,并不意味它比小端多好,而是網(wǎng)絡(luò)的核心是通信,所以大家必須要有共同的標準,即網(wǎng)絡(luò)通信的標準化

所以在TCP/IP協(xié)議中,RFC1700規(guī)定使用大端字節(jié)序為網(wǎng)絡(luò)字節(jié)序,如果使用小端的計算機,接發(fā)數(shù)據(jù)時需要自行將主機字節(jié)序轉(zhuǎn)換為網(wǎng)絡(luò)字節(jié)序

小端字節(jié)序

小端字節(jié)序Little-Endian:數(shù)值的低位字節(jié)存放在內(nèi)存的低地址端,高位字節(jié)存放在內(nèi)存的高地址端本文這里還是以32位的數(shù)0x12345678,來舉個例子

圖片圖片

該數(shù)值,在內(nèi)存中的存儲順序是:0x78563412。小端字節(jié)序最大的優(yōu)點就是

小端字節(jié)序序最大的好處是強制轉(zhuǎn)換數(shù)據(jù)類型效率較高,比如小數(shù)強制轉(zhuǎn)大數(shù)只需要在高位添0;如果大數(shù)強制轉(zhuǎn)小數(shù),直接將高位數(shù)據(jù)丟棄即可,不需要額外再調(diào)整宇節(jié)

圖片圖片

而大端字節(jié)序則需要調(diào)整字節(jié)內(nèi)容,移動數(shù)據(jù)

圖片圖片

在現(xiàn)代計算機中,大多采用小端字節(jié)序,比如x86、DEC VAX、PDP-11等等 當(dāng)然也有采用大端字節(jié)序的,比如:IBM、Sun、PowerPC等處理器 另外ARM系列處理器,大小端字節(jié)序都支持,可配置

判斷當(dāng)前設(shè)備大端or小端?

可以寫個小代碼來快速判斷,我們這里以C/C++語言為例:

BOOL IsBigEndian()
{
    union NUM
    {
        int a;
        char b;
    }num;
    num.a = 0x1234;
    if( num.b == 0x12 )
    {
        return TRUE;
    }
    return FALSE;
}

這里利用聯(lián)合體union,所有成員共用同一塊內(nèi)存的特性,可以輕松地判斷當(dāng)前設(shè)備是否是大小端字節(jié)序

尾語

最后補充一個小故事,大端小端名詞來源于Jonathan Swift書寫的《格列佛游記》,書中描述了小人國,因為吃雞蛋是從大頭的一端剝開還是從小頭的一端這個問題,導(dǎo)致教派之間的沖突,連年征戰(zhàn),死戰(zhàn)不休

這是不是也暗示大端小端爭論,并無較真的意義,怎么好用怎么來,通信交流做好轉(zhuǎn)換的必要措施即可

到如今,從技術(shù)上來說,大小端的并無誰有明顯的優(yōu)勢,更多的是計算機發(fā)展歷史的影響。最初設(shè)計時,對字節(jié)序的選擇往往是任意的,但后續(xù)技術(shù)的發(fā)展,需要背上兼容性的包裹。比如ARM明明大小端都支持,為啥大部分是小端,主要是移植x86程序方便;

還有RISC-V手冊描述他們選擇了小端序的原因:因為小端字節(jié)序,目前在商業(yè)上占主導(dǎo)地位(所有x86系統(tǒng)、iOS、Android和Windows for ARM)。想拓寬視野地可以去看看The RISC-V Instruction Set Manual Volume I: Base User-Level ISA

當(dāng)然也有商業(yè)競爭的原因,Intel的x86選擇小端(可能是為了躲避專利糾紛),最終擊敗了IBM,導(dǎo)致如今主機領(lǐng)域小端是主流

參考資料:

《深入理解計算機系統(tǒng)》

https://inst.eecs.berkeley.edu/~cs250/fa11/handouts/riscv-spec.pdf

https://www.spiceworks.com/tech/tech-general/articles/big-endian-vs-little-endian

責(zé)任編輯:武曉燕 來源: 小牛呼嚕嚕
相關(guān)推薦

2023-10-11 18:30:39

Web系統(tǒng)程序

2022-03-30 15:25:28

鏈接過程計算機系統(tǒng)程序

2021-12-10 06:52:23

計算機病毒安全

2018-10-08 14:10:46

2021-01-22 05:44:24

數(shù)據(jù)底層架構(gòu)

2023-12-01 15:57:07

系統(tǒng)調(diào)用計算機

2021-01-27 14:18:17

量子計算傳統(tǒng)計算量子機器

2011-07-05 13:11:45

2018-08-24 10:35:49

物理內(nèi)存存儲

2012-12-20 09:42:16

Linux超級計算機HPC

2015-07-31 10:35:18

實時計算

2013-11-07 14:32:41

Ubuntu技巧

2015-03-24 14:11:41

程序員

2012-04-16 14:58:42

2009-06-25 09:01:42

Linux

2016-12-12 09:39:40

2020-11-06 09:19:20

應(yīng)用編譯源代碼

2021-04-15 11:43:53

C語言位域字節(jié)序

2017-07-14 15:40:28

2021-08-12 15:00:01

Linux終端
點贊
收藏

51CTO技術(shù)棧公眾號