給你講個來自《格列佛遊記》的計算機故事

今天這篇文章,想跟大家分享一個計算機科學(PLC編程)的基礎知識:即數據在內存中的存放序列(位元組序)的問題。沒看明白?詳細說明下:我們知道,「位」(bit)是計算機數據存儲的最小單位,八個「位」組成一個位元組(Byte),兩個位元組組成一個「字」(Word),其中一個位元組為該「字」的低位元組,另一個位元組為該「字」的高位元組。

好了,現在問題來了:當我們把一個整數(比如十六進位數:0x0384)存放到一個「字」里的時候,可以有兩種存放方法:一種方法可以把「0x03」存放到低位元組,把「0x84」存放到高位元組;另一種方法正好相反:可以把「0x03」存放到高位元組,把「0x84」存放到低位元組。

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

丹尼·科恩在論文中用這個故事進行類比,並提出了最高權重位(Most Significant Bit,MSB)和最低權重位(Least Significant Bit,LSB)的概念。

所謂「最高權重位(MSB)」,是指二進位數制中,位數最大的位。所謂「最低權重位(LSB)」,是指二進位數制中,位數最小的位。比如二進位數:1101,最左邊的「1」,能代表「2」的「3」次方;從左數第二個「1」,能代表「2」的「2」次方;而最右邊的「1」,代表「2」的「0」次方。可見最左邊的「1」權重最高,所以該位就是「最高權重位(MSB)」,最右邊的「1」權重最低,所以該位就是「最低權重位(LSB)」。

把「最高權重位(MSB)」存放到低位元組,把「最低權重位(LSB)」存放到高位元組,這種位元組序,稱為「大端(Big-Endian)」位元組序;相反,把「最低權重位(LSB)」存放到低位元組,把「最高權重位(MSB)」存放到高位元組,這種位元組序,稱為「小端(Little-Endian)」位元組序。

比如:要把十六進位數0x01020304,存放到起始地址為0x100的地方。按照大端(Big-Endina)位元組序存放的方式,會把0x01存放到起始地址0x100中,把0x04存放到地址0x103中;而如果按照小端(Little-Endian)位元組序方式存放,會把0x01存放到地址0x103中,把0x04存放到地址0x100中,如下圖:

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

相關參考文章:

STEP7中如何用簡潔的代碼獲取字元串的長度

工業串口通信之甲方乙方

官網方正智芯提供本文PDF版本下載:

推薦閱讀:

深入PCI與PCIe之二:軟體篇
什麼樣的技術 Leader 是稱職的?
做遊戲,學編程(C語言) 5 數組之生命遊戲
學會網頁製作需要多長時間?

TAG:可编程逻辑控制器PLC | 计算机技术 | 电气自动化 |