此書第二次看的時候確實不如第一遍看激動人心。
在第二章主要是敘述二進位制的運算。雖然這回讀的是第三版,但依然是不變的二進位制表示,加法,乘法。補碼,二進位制位移。以及型別轉換。
這裡面有一些很有意思的符合直覺的東西:
位移分左移(右邊新增0),邏輯右移(左邊新增0),算術右移(左邊新增最高位),與此對應的是較小型別整數與其較大型別整數轉換,無符號數就補全0,有符號數就補全最高位(因為要保證數字的值是不變的嘛。)
而且有符號無符號數的來回轉換也高度符合這個思想:資訊的不變性。
計算機是要用暫存器或者記憶體儲存資訊的,不能因為隨便的轉換就把01序列給改變了啊。所以只能是重新解釋這一串01序列,也就是最高位是解釋成負權值還是正權值的問題。
與此對應的截斷,也是底層的01不變,但是確確實實把前面的部分去掉了,然後依據剩餘的01序列解釋這個數字。
有了這些依據,也就知道為什麼負數表示的範圍比整數多乙個了。(因為實際上負數是與非負數對應的,差的那個便是0)
再說浮點數,浮點數比較奇特,還有+0,-0....
浮點數的描述是按照ieee754來表達的,一位的符號位,一部分的小數字,一部分的權重。(這兩部分在double與float各不一樣),由此可以看出浮點數表示不了精確的數字,只是近似值,這在python裡依然有這個毛病,做浮點運算總是差一點點。
第三章講了機器指令,實際上就是組合語言。
彙編產生的**往往能反映出機器執行的本質,比如賦值,加減乘除,引用,等等。
這裡讓我感興趣的是leaq指令,這個在第二版並沒有提到,這個是「披著定址指令的加乘法」,實際上等於一條mov指令,把位址計算出來然後放到目的暫存器,計算方式等價於陣列定址方式。
陣列,結構體實質上是一樣的,都是一段連續的記憶體,但是結構體會補齊空隙,達到2、4、8的倍數,僅僅是給了每段記憶體的型別罷了。比如s->x就是計算x成員的首位址。甚至二維、多維陣列也是如此。這個在第一次看的時候讓我著實驚訝了一下。
比如乙個陣列int a那麼a實質上是引用了a+(2*1+1)*4==>a+12處的位址,也就是依靠劃分每段為乙個「一維陣列」,這就能解釋為什麼乙個二維陣列按行遍歷比按列遍歷更快了,這裡面實際上還涉及了快取命中以及區域性性的問題。
而聯合是max即最大元素的空間大小,機器指令中的三種迴圈都是以do-while實現的,有的加了條件分支罷了。
分支**有時候並不可靠,但是流水線工作模式會讓它繼續執行,直到發現錯誤就返回原來的地方,這稱為分支錯誤處罰。
tcp ip協議第二 三章
第一章講解的是tcp ip的概述,涵蓋了網路的各個方面 第二章講解物理鏈路層 乙太網和ieee802 封裝 拆分 slip序列線網路 鏈路層主要功能就是 1 傳送接收ip資料報 2 傳送arp和接收arp模組應答 3 傳送rarp和接收rarp模組應答 環迴介面本機通訊仍然完成的是整個網路分層的步驟...
第一 二 三章習題總結
求無窮小的階數 如果是變上限函式積分,裡面可以用等價無窮小替換 判斷階數可以直接按照變上限的階數 底數階數 1 對於一點上的分段函式 如果函式連續,並且在該點去心鄰域內可導,導函式極限存在,則導數值等於函式值 證明 使用定義,然後用洛必達證明 問題 如何求分段函式在分界點上的導數 定義,採用導數的定...
《CSAPP》第一章小結
從乙個hello.c程式講起。hello.c經過預處理把頭檔案的內容插入程式中變成hello.i。hello.i經過編譯器處理轉為組合語言版本的hello.s,hello.s經過彙編器處理變為二進位制的hello.o,並且經過鏈結printf.o變為可執行程式。執行是經過把本地磁碟的可執行的hell...