csapp_study_2 -- 信息的表示和处理
从这一章开始,我们对计算机系统的各个部分进行深入的学习,第二章主要讲述了信息的表示和处理,主要分为以下四个部分
- 信息存储
- 整数表示
- 整数运算
- 浮点数
信息的存储
通常情况下,程序将内存视为一个非常大的数组,数组的元素是由一个个的字节组成,每个字节都由一个唯一的数字来表示,我们称为地址(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$ ,用一个例子说明: