每天2頁。
- 2021年4月底,我將啃下這本700頁大部頭。
- 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程序到可執行程序,需要經過以下步驟:
- 預處理:替換“#include <stdio.h>”的內容
- 編譯:從高級語言翻譯成彙編語言(這一步依然是文本文件)
- 彙編:從彙編語言翻譯成機器碼
- 鏈接:把printf.o這種預編譯好的文件鏈接到上一步編譯好的文件中,生成可執行文件