每天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
image.png把控制权从某个进程转移到另一个进程时,会进行上下文切换
应用程序通过特殊的系统调用指令移交控制权
并发/并行
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这种预编译好的文件链接到上一步编译好的文件中,生成可执行文件
网友评论