給你講個(gè)來自《格列佛游記》的計(jì)算機(jī)故事
今天這篇文章,想跟大家分享一個(gè)計(jì)算機(jī)科學(xué)(PLC編程)的基礎(chǔ)知識(shí):即數(shù)據(jù)在內(nèi)存中的存放序列(字節(jié)序)的問題。沒看明白?詳細(xì)說明下:我們知道,“位”(bit)是計(jì)算機(jī)數(shù)據(jù)存儲(chǔ)的最小單位,八個(gè)“位”組成一個(gè)字節(jié)(Byte),兩個(gè)字節(jié)組成一個(gè)“字”(Word),其中一個(gè)字節(jié)為該“字”的低字節(jié),另一個(gè)字節(jié)為該“字”的高字節(jié)。
好了,現(xiàn)在問題來了:當(dāng)我們把一個(gè)整數(shù)(比如十六進(jìn)制數(shù):0x0384)存放到一個(gè)“字”里的時(shí)候,可以有兩種存放方法:一種方法可以把“0x03”存放到低字節(jié),把“0x84”存放到高字節(jié);另一種方法正好相反:可以把“0x03”存放到高字節(jié),把“0x84”存放到低字節(jié)。

應(yīng)該使用哪種存放方式呢?這個(gè)問題,曾經(jīng)在計(jì)算機(jī)科學(xué)界引起巨大的爭(zhēng)論。1980年,英國計(jì)算機(jī)科學(xué)家丹尼·科恩(Danny Cohen)發(fā)表了一篇題為“在圣戰(zhàn)中祈求和平(On Holy Wars and a Plea for Peace)”(注:北島李工譯)的論文。丹尼·科恩在論文中引述了英國作家喬納森·斯威夫特(Jonathan Swift)于1726出版的一部長(zhǎng)篇諷刺小說:格列佛游記(Gulliver's Travels)中的一個(gè)故事。故事中小人國的臣民為水煮蛋應(yīng)該是從大的一端(Big-End)剝開還是小的一端(Little-End)剝開而爭(zhēng)論不休。主張從大的一端(Big-End)把水煮蛋剝開的人被稱為Big-Endian(大端),主張從小的一端(Little-End)把水煮蛋剝開的人被稱為L(zhǎng)ittle-Endian(小端)。

丹尼·科恩在論文中用這個(gè)故事進(jìn)行類比,并提出了最高權(quán)重位(Most Significant Bit,MSB)和最低權(quán)重位(Least Significant Bit,LSB)的概念。
所謂“最高權(quán)重位(MSB)”,是指二進(jìn)制數(shù)制中,位數(shù)最大的位。所謂“最低權(quán)重位(LSB)”,是指二進(jìn)制數(shù)制中,位數(shù)最小的位。比如二進(jìn)制數(shù):1101,最左邊的“1”,能代表“2”的“3”次方;從左數(shù)第二個(gè)“1”,能代表“2”的“2”次方;而最右邊的“1”,代表“2”的“0”次方。可見最左邊的“1”權(quán)重最高,所以該位就是“最高權(quán)重位(MSB)”,最右邊的“1”權(quán)重最低,所以該位就是“最低權(quán)重位(LSB)”。
把“最高權(quán)重位(MSB)”存放到低字節(jié),把“最低權(quán)重位(LSB)”存放到高字節(jié),這種字節(jié)序,稱為“大端(Big-Endian)”字節(jié)序;相反,把“最低權(quán)重位(LSB)”存放到低字節(jié),把“最高權(quán)重位(MSB)”存放到高字節(jié),這種字節(jié)序,稱為“小端(Little-Endian)”字節(jié)序。
比如:要把十六進(jìn)制數(shù)0x01020304,存放到起始地址為0x100的地方。按照大端(Big-Endina)字節(jié)序存放的方式,會(huì)把0x01存放到起始地址0x100中,把0x04存放到地址0x103中;而如果按照小端(Little-Endian)字節(jié)序方式存放,會(huì)把0x01存放到地址0x103中,把0x04存放到地址0x100中,如下圖:

英特爾X86的微處理器使用的小端(Little-Endian)字節(jié)序,ARM系列單片機(jī)使用的是大端(Big-Endian)字節(jié)序。西門子S7系列PLC使用大端(Big-Endian)存放方式,比如:給DB801.DBW510賦值W#16#0384(即:0x0384),在線監(jiān)控發(fā)現(xiàn)DB801.DBB510的值為0x03,DB801.DBB511的值為0x84,可見存放方式為大端(Big-Endian)字節(jié)序。

網(wǎng)絡(luò)傳輸也存在字節(jié)序的問題,以太網(wǎng)使用大端(big-endian)字節(jié)序,串口通信(RS232)使用小端(little-endian)字節(jié)序。
好了,關(guān)于字節(jié)序就先聊到這里了。另外關(guān)于丹尼·科恩(Danny Cohen)那篇著名的論文,我Google到了英文原著,會(huì)稍加排版,放到官網(wǎng)本文的末尾,感興趣的可以下載來看看。
相關(guān)參考文章:
STEP7中如何用簡(jiǎn)潔的代碼獲取字符串的長(zhǎng)度
工業(yè)串口通信之甲方乙方
官網(wǎng)提供本文PDF版本下載:
-
Origin(Pro):學(xué)習(xí)版的窗口限制【數(shù)據(jù)繪圖】 2020-08-07
-
如何卸載Aspen Plus并再重新安裝,這篇文章告訴你! 2020-05-29
-
CAD視口的邊框線看不到也選不中是怎么回事,怎么解決? 2020-06-04
-
教程 | Origin從DSC計(jì)算焓和比熱容 2020-08-31
-
CAD外部參照無法綁定怎么辦? 2020-06-03
-
CAD中如何將布局連帶視口中的內(nèi)容復(fù)制到另一張圖中? 2020-07-03
