CSAPP 学习笔记
# CSAPP 学习笔记
此笔记只记录一些比较重要的部分
# 第2章 信息的表示和处理
# 大端小端方式
- 最低有效字节在最前面,叫小端法
- 最高有效字节在最前面,叫大端法
这里有一个 的类型为 int,位于 0x100 处,十六进制值为 0x01234567
在 0x01234567,高字节为 0x01,低字节为 0x67
# C 语言中的位移运算
这里提到一个叫 算数右移 和 逻辑右移 的区别
- 逻辑右移会在最左端加上
- 算数右移会在最左端加上最高有效位的值,在处理负数的时候有用

在 C 语言中,几乎所有的编译器都采用算数右移
# 有符号和无符号数
对于 int 类型,对位来说是之间复制,只是解释位的方式改变了
#include <stdio.h>
int main() {
short x = -12345;
unsigned short ux = (unsigned short)x;
printf("x = %d\n", x);
printf("ux = %u\n", ux);
}
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
输出得到:
x = -12345
ux = 53191
1
2
2
可以看到 的 16 位补码和 的补码完全相同
当一个有符号数和一个无符号数进行运算时,C 语言会隐式得将有符号的参数强制转换成无符号数
# 扩展一个数字的表示
- 将一个无符号的数转化成一个更大的类型,只需要在前面加 0,这被称为 零拓展
- 将一个补码数字转化成一个更大的数据类型,可以执行一个 符号拓展 就是在前面添加最高有效位的值
- 将一个数字转化成一个更小的数据类型,我们会截断前面的多的位数,所以有可能一个正数有可能会变成一个负数,因为最高位被置为 了
# IEEE 浮点表示
这里有一个公式是:
这个是格式化的值,我们对于一些特定的 significand 和 exponect 组合,可以定义一些特殊的数
# 浮点数的舍入
一般来说,采用一个向偶数舍入的方式,例如: 舍入后是 , 舍入后是
在二进制表现下就是,如果后面的位刚好是 ,我们倾向于让最低有效位为 ,例如 舍入到小数点后两位为 , 舍入到小数点后两位为