摘要:這個(gè)就有意思了我們發(fā)現(xiàn)我們?nèi)绻麚Q一種書(shū)寫(xiě)方式可以更直觀(guān)理解數(shù)組在內(nèi)存中模樣事件起因前些天閱讀一本相關(guān)書(shū)籍的時(shí)候看到這么一段話(huà)顯而易見(jiàn)上述寥寥代碼的主要內(nèi)容是在闡述僅僅作為視圖讀寫(xiě)內(nèi)存的道理和公用了同一段內(nèi)存而我今天想說(shuō)這里有一個(gè)很有意思的事
這個(gè)就有意思了, 我們發(fā)現(xiàn), 我們?nèi)绻麚Q一種書(shū)寫(xiě)方式, 可以更直觀(guān)理解數(shù)組在內(nèi)存中模樣.
事件起因前些天閱讀一本js 相關(guān)書(shū)籍的時(shí)候, 看到這么一段話(huà).
var buffer = new ArrayBuffer(12); var x1 = new Int32Array(buffer); x1[0] = 1; var x2 = new UInt8Array(buffer); x2[0] = 2; x1[0] // 2
顯而易見(jiàn), 上述寥寥代碼的主要內(nèi)容是在闡述 TypedArray僅僅作為 ArrayBuffer 視圖讀寫(xiě)內(nèi)存的道理. x1和x2公用了同一段內(nèi)存._
而我今天想說(shuō)這里有一個(gè)很有意思的事情.
字節(jié)序大家公認(rèn)的概念, 也是計(jì)算機(jī)基礎(chǔ)理論知識(shí)的一部分.
內(nèi)存中使用8個(gè)二進(jìn)制位(bit)表示一個(gè)字節(jié)(Byte).
UInt8 是使用一個(gè)字節(jié)表示的無(wú)符號(hào)整數(shù)
UInt32 則是使用了4個(gè)字節(jié)表示的無(wú)符號(hào)整數(shù)
我們使用無(wú)符號(hào)整數(shù)這樣簡(jiǎn)單的數(shù)據(jù)結(jié)構(gòu), 來(lái)看看剛剛的賦值過(guò)程做了什么.
x1[0] = 1
我們知道, x1是一個(gè) Int32視圖, 所以第一個(gè)元素的長(zhǎng)度是四個(gè)字節(jié). 也就是說(shuō), 該部分的值是 0x000001.
高位 | 低位 | ||
---|---|---|---|
00 | 00 | 00 | 01 |
x2[0] = 2
我們知道, x2是一個(gè) Int8視圖, 所有第一個(gè)元素的長(zhǎng)度是一個(gè)字節(jié), 也就是說(shuō), 該部分的值是 0x02.
瞧, 現(xiàn)在 x1[0] 應(yīng)該變成什么樣?
是 0x00000002 ?
高位 | 低位 | ||
---|---|---|---|
00 | 00 | 00 | 02 |
還是 0x02000001 ?
高位 | 低位 | ||
---|---|---|---|
02 | 00 | 00 | 01 |
這個(gè)問(wèn)題的本質(zhì), 即 __內(nèi)存中, Int32數(shù)據(jù)類(lèi)型內(nèi)部的四個(gè)字節(jié), 是低位在前, 還是高位在前?__.
如果是高位在前, 則x2[0]指向的是 x1[0]最高位的字節(jié). 反之, 則是指向的最低位.
關(guān)于字節(jié)序, 在計(jì)算機(jī)的世界里有這樣一種定義和區(qū)分. 大端序/小端序.
詳細(xì)設(shè)定我們參考 (wiki)[https://zh.wikipedia.org/wiki... 就好.
我們絕大多數(shù)時(shí)候再現(xiàn)代計(jì)算機(jī)上使用的字節(jié), 都是小端序.
而網(wǎng)絡(luò)傳輸中使用的是大端序, 如 IP 報(bào)頭
瞧, 書(shū)寫(xiě)一個(gè)數(shù)組試試.假設(shè)我們有一個(gè) UInt16Array(3)
var x3 = new UInt16Array([11, 22, 33]);
我們?cè)诓莞寮埳蠒?huì)這么寫(xiě)
x3[0] | x3[1] | x3[2] |
---|---|---|
11 | 22 | 33 |
也就是說(shuō)我們習(xí)慣性把第一元素寫(xiě)在左邊. 換成十六進(jìn)制的寫(xiě)法就是
0x000B | 0x0016 | 0x0021 |
---|
如果現(xiàn)在沒(méi)看出來(lái)為什么我想說(shuō)從左到右書(shū)寫(xiě)數(shù)組會(huì)造成有趣的誤解, 那我再試著用二進(jìn)制方式把這個(gè)數(shù)組寫(xiě)出來(lái) :)
00000000 00001011 | 00000000 00010000 | 00000000 00100001 |
---|
注意,最左邊一個(gè)格子是 x3[0] 哦! 這時(shí)候, 我們?cè)囍褂脁2這樣的 UInt8Array 視圖來(lái)解讀這個(gè)數(shù)組.
正確的解讀應(yīng)該是
00001011 | 00000000 | 00010000 | 00000000 | 00100001 | 00000000 |
---|---|---|---|---|---|
0x0B | 0x00 | 0x16 | 0x00 | 0x21 | 0x00 |
11 | 0 | 22 | 0 | 33 | 0 |
而不是
00000000 | 00001011 | 00000000 | 00010000 | 00000000 | 00100001 |
---|---|---|---|---|---|
0x00 | 0x0B | 0x00 | 0x16 | 0x00 | 0x21 |
0 | 11 | 0 | 22 | 0 | 33 |
因?yàn)? 小端字節(jié)序的設(shè)計(jì)中, __低位在前__.
所以, 如果我們一開(kāi)始就在腦海中將所構(gòu)思的數(shù)組從右往左書(shū)寫(xiě)
x3[2] | x3[1] | x3[0] |
---|---|---|
33 | 22 | 11 |
0x0021 | 0x0016 | 0x000B |
00000000 00100001 | 00000000 00010000 | 00000000 00001011 |
改變數(shù)據(jù)類(lèi)型去解讀的結(jié)果則是
x2[5] | x2[4] | x2[3] | x2[2] | x2[1] | x2[0] |
---|---|---|---|---|---|
00000000 | 00100001 | 00000000 | 00010000 | 00000000 | 00001011 |
0x00 | 0x21 | 0x00 | 0x16 | 0x00 | 0x0B |
0 | 33 | 0 | 22 | 0 | 11 |
看! 完全不會(huì)有交換字節(jié)帶來(lái)的誤解!
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/84704.html
摘要:是一種強(qiáng)類(lèi)型語(yǔ)言,因此,定義了基本數(shù)據(jù)類(lèi)型。運(yùn)算符先從運(yùn)算符談起。基本數(shù)據(jù)類(lèi)的基本數(shù)據(jù)類(lèi)型同其它高級(jí)程序語(yǔ)言比較類(lèi)似。常用類(lèi)類(lèi)型除了一些基本數(shù)據(jù)類(lèi)型,提供的一些類(lèi)類(lèi)型,使用頻率也很高。 Java 是一種強(qiáng)類(lèi)型語(yǔ)言,因此,Java 定義了基本數(shù)據(jù)類(lèi)型。同時(shí), Java 和其它高級(jí)計(jì)算機(jī)語(yǔ)言一樣,有多種運(yùn)算符,這在我們編程過(guò)程中極為有用。 運(yùn)算符 先從運(yùn)算符談起。 顧名思義,運(yùn)算符解決的是...
摘要:題目要求假設(shè)有一共個(gè)數(shù)字,從左往右開(kāi)始每隔一位刪除一個(gè)數(shù)字,到達(dá)最右側(cè)后,再?gòu)挠彝竺扛粢晃粍h除一個(gè)數(shù)字,如此反復(fù),直到剩下最后一個(gè)數(shù)字。由此可見(jiàn),假如我們定義一個(gè)遞歸函數(shù)我們可以有來(lái)獲取結(jié)果。 題目要求 There is a list of sorted integers from 1 to n. Starting from left to right, remove the fir...
摘要:文檔地址中文文檔英文文檔源碼地址第一個(gè)函數(shù)是,不過(guò)源碼中依賴(lài)了,所以第一篇文章就從開(kāi)始。這個(gè)函數(shù)的作用就是裁剪數(shù)組,從下標(biāo)開(kāi)始,到下標(biāo)結(jié)束,但是并不包含,并將結(jié)果作為一個(gè)數(shù)組返回。并且注明了這個(gè)方法用于代替來(lái)確保數(shù)組正確返回。 百忙之中(閑來(lái)無(wú)事)想抽點(diǎn)時(shí)間好好讀一下源碼,于是就選了Lodash來(lái)寫(xiě)一個(gè)系列罷。讀源碼順序就按照l(shuí)oadsh文檔順序來(lái)。 文檔地址:中文文檔?? 英文文檔源...
摘要:狹義的對(duì)象字面量形式是中我最喜歡的一種結(jié)構(gòu),因?yàn)槠潇`活。今天準(zhǔn)備介紹中對(duì)象的擴(kuò)展相關(guān)的知識(shí)點(diǎn),由于煲劇晚了,先寫(xiě)一半,剩下的下次再介紹。 狹義的對(duì)象字面量形式是JavaScript中我最喜歡的一種結(jié)構(gòu),因?yàn)槠潇`活。今天準(zhǔn)備介紹ES6中對(duì)象的擴(kuò)展相關(guān)的知識(shí)點(diǎn),由于煲劇晚了,先寫(xiě)一半,剩下的下次再介紹。 主要知識(shí)點(diǎn): 對(duì)象屬性的簡(jiǎn)寫(xiě) 動(dòng)態(tài) · 屬性名 Object.is(value1,...
閱讀 2027·2021-11-15 11:38
閱讀 2059·2019-08-30 15:55
閱讀 2195·2019-08-30 15:52
閱讀 3178·2019-08-30 14:01
閱讀 2698·2019-08-30 12:47
閱讀 1163·2019-08-29 13:17
閱讀 1075·2019-08-26 13:55
閱讀 2641·2019-08-26 13:46