CSAPP

作者: elon_wen | 来源:发表于2020-04-20 13:37 被阅读0次

    每天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

    image.png

    把控制权从某个进程转移到另一个进程时,会进行上下文切换

    应用程序通过特殊的系统调用指令移交控制权

    并发/并行


    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这种预编译好的文件链接到上一步编译好的文件中,生成可执行文件
    image.png

    相关文章

      网友评论

        本文标题:CSAPP

        本文链接:https://www.haomeiwen.com/subject/mznrihtx.html