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