Introduction(csapp-1)
-
C语言程序编译的四个阶段
- 预处理
- 根据 # 开头的命令修改文件,例如将头文件中的内容直接插入原程序文本中
- 生成 .i 文件
- 编译
- 编译成汇编语言
- 生成 .s 文件
- 汇编
- 编译成机器语言
- 生成 .o 文件(二进制)
- 链接
- 链接调用的内置函数, 例如 printf.o
- 生成可执行文件
- 预处理
-
cache高速缓存
- 较大的储存设备比较小的要慢很多
- 所以使用cache处理一些经常访问的数据要比内存快很多(但慢与寄存器)
-
操作系统可以看做应用程序和硬件之间的软件
- 文件是对 I/O 设备的抽象
- 虚拟内存是对主存和磁盘 I/O 设备的抽象
- 进程是对处理器,I/O 设备, 主存的抽象
-
每个 I/O设备都可以看做文件
-
网络可以看做一个 I/O设备
-
Amdahl定律的主要观点:想要显著的加速整个系统,必须提升系统中很大部分的速度, 单独提升某一个部分(哪怕很显著)没有太大效用
bits,bytes and integers-part1(csapp-2.1)
-
1 byte = 8 bits (一个字节8位二进制 = 2位十六进制)
-
shift opeartion
- << : 向左移动,低位补零
-
: 向右移动
- logical shift 高位补零
- arithmetic shift 当最高位为一时补一
- 对于无符号数采用逻辑右移,对于有符号数采用算数右移
- 移动数量不能<0或大于当前word size
-
补码
-
2to10时最高位代表的数取负即可
-
C语言默认为有符号整形
-
有符号和无符号混合时返回无符号
-
包括两者比较时
-
//会出错,因为sizeof返回值是无符号的,结果会转变为无符号,故会变成死循环
#define DELTA sizeof(int)
int i;
for (i = CNT; i-DELTA >= 0; i-= DELTA)
- Umax = 2*Tmax + 1
- |Tmin| = Tmax + 1
- 补码转换成无符号数
- f(x) = x + 2 ^w if x <0; f(x) = x if x >=0;(w是位数) - 无符号数转换成补码
- f(x) = x - 2 ^w if x > Tmax; f(x) = x if x < Tmax;(w是位数)
- sign extension(例如8位扩展为16位)
- 无符号添0
- 有符号复制最高位
-
截断
-对于无符号数 x’ = x mod 2^k if x’是x截断为k位的结果
对于有符号数, 多了一个取补码的步骤
-
64位和32位计算机主要差异在虚拟地址空间的大小, 32位最大4GB,而64位最大16EB
-
C语言中,int通常4字节,short2字节,char1字节,float4字节,double8字节
-
小端法
- intel采用小端法储存数据
- intel采用小端法储存数据
bits,bytes and integers-part2(csapp-2.2,2.3)
-
用移动位操作来做快速乘法 : u << k == u * 2^k
- u << 3 == u * 8
- ( u <<5 ) - ( u <<3 ) == u *24
-
用移动位操作来做快速除法
-
对于无符号数
- u >>k == u / 2^k 并向下取整
- u >>k == u / 2^k 并向下取整
-
对于有符号
-
向下取整时是一样的
-
执行 (x + (1 << k) -1) >> k 时,向上取整
- 当无需rounding的时候不变
- 当需要rounding的时候,即后k-1位不全是0时,会进1
-
-
- C puzzles
- 考虑 Tmin(Tmin是一个特殊值,任何时候都应该测试该值)
- 考虑 Tmin(Tmin是一个特殊值,任何时候都应该测试该值)
- 补码非的二进制计算法
- 对所有位取反再加一
- 对从右往左第一个1左的所有位取反
float point(csapp-2.4)
- IEEE浮点标准使得浮点数可以通过将其位表达式解释为无符号整数进行排序
- 浮点数加法不支持结合律,乘法不支持结合律和分配率
- 整数转化成浮点数
- step1
- step2
- rounding
- step3
- step1