CSAPP

每天2頁。

  1. 2021年4月底,我將啃下這本700頁大部頭。
  2. 2020年5月底,我將學會浮點數的2進製表示。

2020/05/10 閱讀內容65-66頁 Day19 中斷1次

發現自己對於之前看到的阿貝爾羣完全沒有理解。習題也留了一道沒有做出來。

2020/05/11 補充
按位取反再加1的另一種表示方法是,最右邊的1左邊全取反


2020/05/09 閱讀內容62-64頁 Day18 中斷1次

介紹了無符號數和補碼加法中的溢出。

阿貝爾羣,這個概念不知道有什麼用。


2020/05/08 閱讀內容60-61頁 Day17 中斷1次

2個4位的無符號數相加,溢出後相當於mod 16。(想起前面章節關於截斷的部分)


2020/05/07 閱讀內容58-59頁 Day16 中斷1次

感慨:要想用C寫出沒有Bug的代碼不容易!


2020/05/06 閱讀內容56-57頁 Day15 中斷1次

沒想到昨天斷了!!

無符號數的截斷是對2k取mod
有符號數的截斷是先轉成無符號數,然後執行取mod操作後再轉爲有符號數


2020/05/04 閱讀內容54-55頁 Day14


2020/05/03 閱讀內容51-53頁 Day13

TMin的寫法:CS:APP Web Aside DATA:TMIN:
Writing TMin in C

按目前的理解:0x80000000會按無符號的類型,先圈定一個範圍,然後再取負號。


2020/05/02 閱讀內容47-50頁 Day12

補碼轉化爲無符號數:如果該數爲正數,則不變;如果該數爲負數,則爲x + 2^w。


2020/05/01 閱讀內容45-46頁 Day11

有符號數和無符號數一樣,都可以表示爲2的i次方相加的形式,唯一的差別時有符號數的最高位還要乘以-1作爲權重

最高位用來表示正負這個說法不準確,應該說最高位用來表示是否爲負。以“00/01/10/11”爲例,10和11表示負數,00和01就表示的是非負數,因爲0是非負數,因此表示的最小值的絕對值要比最大值大1


2020/04/30 閱讀內容41-44頁 Day11

無符號數的編碼具備唯一性
雙射


2020/04/29 閱讀內容39-40頁 Day10

XOR還可以用於取補碼(可以用0x0-0xF驗證下)

(XOR a b) = (OR (AND (NOT a) b) (AND (NOT b) a))

分配律、結合律待補充

x == y 等同於 (NOT (XOR x y))

&&和||是具備短路能力的運算符

右移包括邏輯右移和算數右移

2020/05/06 補充
邏輯右移:左端補k個0 -- 無符號數必須是邏輯的
算數右移:左端補k個有效位 -- 大部分有符號數採用算數右移動


2020/04/28 閱讀內容37-38頁 Day9

這兩頁主要是習題;

關於XOR的小trick:
a ^ a = 0
0 ^ a = a


2020/04/27 閱讀內容34-36頁 Day8

              | 不匹配 | 匹配                |
0x00359141 ->        1101011001000101000001
0x4A564504 -> 1001010010101100100010100000100

觀點:用位向量表示有限集合。

2020/04/30 補充
位向量:長度固定的0/1串。位向量的運算可以定義成每個元素的運算。

布爾代數和整數運算的相似性:
AND類似於乘法/OR類似於加法
整數運算中乘法對於加法是有分配率的
不過在布爾代數中它倆互有分配率

布爾環:只有XOR/AND/NOT的運算稱爲布爾環。整數運算中x + (-x) = 0,x和-x互爲加法逆元,而在布爾環中,x XOR x = 0,x自身是自身的加法逆元


2020/04/26 閱讀內容32-33頁 Day7

一個基本上已經忘記的關鍵字:typedef,定義一種新的數據類型

指針和數組之間應該沒有本質的差別。可以用指針引用數組,也可以用數組來引用指針


2020/04/25 閱讀內容29-31頁 Day6

介紹了底層數據存儲的2種格式,大端法和小端法。來自格列弗遊記中雞蛋的大端和小端。


2020/04/24 閱讀內容21-28頁 Day5

介紹的是2進制、10進制、16進制的轉化,暫時沒有什麼特別需要記錄的

2020/04/30 補充
字長的概念:指明瞭指針類型數據佔用幾個位。虛擬內存是以此作爲尋址依據的(比如找到指針0x00000001對應的內存地址),所以一個32位字長的操作系統可以尋址的最大空間爲0x00000000 - 0xFFFFFFFF,一共2^32 種可能。每一種可能,對應的是1個字節的數據,也就是最多有2^32 字節大約4G的存儲容量。


2020/04/23 閱讀內容13-20頁 Day4

虛擬內存爲進程提供了一個假象:每個進程都在獨佔內存

Amdahl定律:對系統的某一部分加速時,加速的效果取決於該部分的重要性和加速程度:

Tn = (1 - a) * To + (a * To)/k

其中:
Tn是新時間
To是舊時間
a是佔比,也就是重要性
k是加速倍數,也就是加速程度

併發是通過切分時間片來同時做某事,並行是真正同時做某事。

線程級別是併發
指令級別是並行
單指令、多數據並行


2020/04/22 閱讀內容11-12頁 Day3

把控制權從某個進程轉移到另一個進程時,會進行上下文切換

應用程序通過特殊的系統調用指令移交控制權

併發/並行


2020/04/21 閱讀內容5-10頁 Day2

知識點:
計算機的組成主要包括以下部分:
總線、IO、主存、CPU

從邏輯上講,存儲器是一個線性的字節數組,每個字節都有唯一的地址(數組索引),這些地址是從零開始的
任何時刻PC都指向主存中某條機器指令的地址,CPU無非是在不斷的、一條條的執行指令

CPU中各種指令是以寄存器爲主視角的,包括Load/Store等等。這和JVM的指令集是一致的

指令集架構是抽象、微體系結構是實現

觀點:系統花費了大量的時間把信息從一個地方挪到另一個地方。利用高速緩存,可以把程序的性能提升一個數量級


2020/04/20 閱讀內容1-4頁 Day1

觀點:信息 = 位 + 上下文
解釋:不同的上下文中,同樣的字節序列可能表示整數、浮點數、字符串等等

聯想到計算機中指令和數據,底層存儲的格式也是一致的,也是通過上下文區分

知識點:
從一個.c程序到可執行程序,需要經過以下步驟:

  1. 預處理:替換“#include <stdio.h>”的內容
  2. 編譯:從高級語言翻譯成彙編語言(這一步依然是文本文件)
  3. 彙編:從彙編語言翻譯成機器碼
  4. 鏈接:把printf.o這種預編譯好的文件鏈接到上一步編譯好的文件中,生成可執行文件
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章