csapp_study_2 -- 信息的表示和处理

从这一章开始,我们对计算机系统的各个部分进行深入的学习,第二章主要讲述了信息的表示和处理,主要分为以下四个部分

  1. 信息存储
  2. 整数表示
  3. 整数运算
  4. 浮点数

信息的存储

通常情况下,程序将内存视为一个非常大的数组,数组的元素是由一个个的字节组成,每个字节都由一个唯一的数字来表示,我们称为地址(address),这些所有地址的集合就称为虚拟地址空间(virtual address space)

字节

概念以及表示法

字节(byte)是信息存储的基本单元,一个字节是由8个位(bit)组成,在二进制表示法中,每一个位的值可能有两种状态,0或者1,当这8个位全为0时,表示一个字节的最小值,当这8个位全为1时,表示最大值,如果用十进制来表示,那么一个字节的取值范围就在0~255之间(包括0和255),我们把这种按照一位一位表示数据的方式称为位模式,使用二进制表示法比较冗长,而十进制表示法与位模式之间的转换又比较麻烦,因此我们引入十六进制数来表示位模式

十六进制数

我们熟悉的十进制数,是由数字09组成的,对于十六进制数,则是由数字09和字母AF来表示16个可能的数值。在C语言中,十六进制数是以0x开头,这个x可以是小写,也可以是大写,字母部分既可以全部是大写,也可以全部是小写,甚至是大小写混合也是正确的,下图展示了015这16个数的十六进制、十进制以及二进制的表示方法

有时候我们需要进行数据的进制转换,csapp原书中介绍了一个小技巧,记住16进制数A、C、F所对应的十进制数,那么B、D的数值可以由A和C的加一得到,E的数值可以由F减一得到,十六进制与二进制之间的转换比较简单,通过展开每个十六进制数字,然后将他转换成对应的二进制格式即可,这样我们就得到了二进制的表示方法

反过来,给出一个二进制数,将他转换成十六进制,我们从右边开始,每四位为一组,最左边如果小于四位(总位数不是四的倍数),这时将前面进行补0,然后将每四位一组的二进制数进行一一转换,即可得到对应的十六进制数

快速转化

形如 $2^n$ 的数快速转为二进制数

如图所示,2的几次方转换成二进制就是1后面跟几个0

形如 $2^n$ 的数快速转为十六进制数

从刚才讲的十六进制与二进制的转换可知,十六进制的一个0可以代表4个二进制0我们可以将 $n$ 分解成 $i + 4j$ ,其中 $i$ 的可能的值为 $0, 1, 2, 3$ 分别对应 $1, 2, 4, 8$ ,用一个例子说明: