文章目录
CSAPP第二章知识点归纳(信息的表示和处理)
基本概念
- 无符号编码基于传统的二进制表示法,表示大于零或者等于零的数字
- 补码(two’s-complement)编码是表示有符号整数的最常见方式(正负数)
- 浮点数编码是表示实数的科学计数法的以2为基数的版本(近似表示,不是精确的)
- 结果太大不能表示就会发生溢出
信息存储
- 内存的每个字节都由一个唯一的数字来标识,称为它的地址,所有可能的地址的集合就称为虚拟地址空间
- 在C语言中,十六进制数以 0x 或 0X 开头
- 进制转换的方法(虽然简单,但有可能忘记,还是摘抄下来!)
- 对于一个w位的机器而言,虚拟地址的范围是 0~ 2 w − 1 2^w-1 2w−1 ,程序最多访问 2 w 2^w 2w字节
- 下图为32位和64位计算机数据类型的典型的大小
字节顺序(大端法和小端法)
- 最低有效字节在最前面的方式称为小端法,最高有效字节在最前面的方式叫大端法
(需要注意的是上图中,是字节的顺序的不同,在单个字节的八个比特中是按顺序的)(简单记忆:按正常顺序,容易读的是大端法)(大端小端指的是单个数据对象的存储方式,而不是其他的所有字节序列,只有数据是有这两种区分的)
- 打印程序对象的字节表示的代码
#include <stdio.h>
typedef unsigned char *byte_pointer;
void show_bytes(byte_pointer start, size_t len) {
size_t i;
for (i = 0; i < len; i++)
printf(" %.2x", start[i]); //line:data:show_bytes_printf
printf("\n");
}
void show_int(int x) {
show_bytes((byte_pointer) &x, sizeof(int)); //line:data:show_bytes_amp1
}
void show_float(float x) {
show_bytes((byte_pointer) &x, sizeof(float)); //line:data:show_bytes_amp2
}
void show_pointer(void *x) {
show_bytes((byte_pointer) &x, sizeof(void *)); //line:data:show_bytes_amp3
}
void test_show_bytes(int val) {
int ival = val;
float fval = (float) ival;
int *pval = &ival;
show_int(ival);
show_float(fval);
show_pointer(pval);
}
表示字符串
- C语言中字符串被编码为一个以null(值为0)字符结尾的字符数组(一般使用的是ASCII标准)
- Unicode标准的相关知识重点:
- 使用32位表示字符,占用4个字节
- 替代编码,常见的只用1个到2个字节,不常用的要多一些的字节
- UTF-8表示将每个字符编码为1个字节序列,使得ASCII中的和UTF-8中表示一样
布尔代数
- C中的位级运算
- C中的逻辑运算(与位级运算区别,逻辑运算认为所有非零的参数都是True,而参数0表示False,返回0和1)
整数表示
下面这张表还是看看,说不定考试直接用了不知道是什么
补码编码
-
补码编码将字的最高有效位解释为负权(下面的Tmin和Tmax为能表示的最大和最小的数)
B 2 T w ( x ⃗ ) ≐ − x w − 1 2 w − 1 + ∑ i = 0 w − 2 x i 2 i T M i n w ≐ − 2 w − 1 T M a x w ≐ ∑ i = 0 w − 2 2 i = 2 w − 1 − 1