csapp 第二章 信息的表示和处理
信息的表示和处理
本章的话,深入的讲解了我们的数据(信息)是如何在内存中表示,以及存储,后面的部分主要是讲解了我们的整数与浮点数的存储与运算,并且在数学上进行了证明与推导。总的来说,在数学证明与推导上,有点晦涩难懂(数学太菜了)。而且在一定程度上,我们平常也用不到这个,我们只需要了解一下就行了,重点关注比较常用的知识点
信息存储
信息是怎么表示? 我们知道,我们的信息是由位组成的,我们的位就是0,1的集合,这样的表示被成为二进制,由于0101010这样相对于我们人类的十进制,太难理解和阅读了,为了更加简便,人们就思考怎样可以更加简便?因此找到了十六进制来表示。二进制和十六进制的转换很简单而且直观。
我们存储数据的大小是多少呢? 我们应该知道的是,在不同的计算机上,我们的一些数据的大小存储是不同的,比如,我们熟悉的int ,在不同的计算机上有的是占4个字节(大多数),有的计算机上占的是2个字节。因此在讨论所占大小时我们应该考虑计算机本身的存储。下面就是32位,与64位的一些区别。
有一个需要注意的点就是,64位的计算机能够兼容32位的程序,也就是说32位的程序能在64位上跑,64位不的能在32位上跑
内存中如何排列这些字节序? 在不同的计算机中对于字节的排序是不同的,因而对于同一个文本,它的解释方式是不一样的。计算机有两种方式,一个是大端法,一个是小端法。对于大小端可以这样记,所谓大端就是大的位存储在前面(也就是低位),小端就是小的位存储在前面。比如1234,有空间0xa,0xb,0xc,0xd。按照大端存储就是1放在0xa,2放在0xb,3放在0xc,4放在0xd.按照小端排序的话,4放在0xa,3放在0xb,2放在0xc,1放在0xd.
布尔代数
这个就只有两个,一个是ture,一个是false。就是真和假,和我们高中学的知识一样,或,且,非,异或,四中逻辑运算。因为ture和false,刚好和我们的存储的二进制0,1对应,因此计算机上运用广泛。
位运算和逻辑运算
主要区别就是位运算处理的是数据运算,而逻辑运算处理的是一种判断,真假。
位运算
逻辑运算
整数
整数的数据类型
对于整数来说,整数可以分为有符号数和无符号数。在不同的机器上,我们的整数的表示范围有着不同的差别。
32位机器上
64位机器上
这个我们可以发现一个问题,有符号数的负数比整数多表示了一个数,这里是因为有一个整数用来表示0去了。
- 我们大多数机器都是用补码的形式来表示有符号整数
- 对于强制转换类型,是保持位不变改变了解释这些位的解释方式。也就是说存储的数据(0,1)并没有改变,仅仅是解释的方式变了,上下文变了。
- 大多数数字是默认有符号的,如果要创建无符号常量就需要在数字后面加上一个u。
- 强制转换有显式和隐式的,显式强制转换在前面加括号,在写上要转换的类型。隐式强制转换,由编译器自动进行。比如printf中,一个int型,打印用%x,就是隐式转换。
- 一个小的数据类型(float),可以转换为一个交大的数据类型(double)(对位进行扩展),而一个大的数据类型,可能转换不到较小的去(对数字进行截断),因为可能会发生溢出。
- 乘法,与除法,在机器上运行是很慢的,我们可以通过位运算,加法和减法的组合运算来实现,从而提高速度。
浮点数
舍入
对于一个浮点数,或者说对于一个小数,我们计算机是怎么取舍的呢?如果我们学习过c语音可以知道,浮点数是有精度的,也就是说我们的数都是由无限逼近的数进行取舍的,也就是说,举个例子:5/2=2.5,在我们的计算机中这个2.5并不是准确的2.5,可能是2.49876765.有些时候可能我们会纳闷,有些时候计算机是进行的四舍五入,有些时候我们的计算机又进行的是直接抹除小数后面位数。那么到底是怎么取舍的呢?通常情况下我们采取的舍入规则是在原来的值是舍入值的中间值时,采取向偶数舍入(四舍五入)而它的原理 二进制中,末尾为0的数为偶数。而若不是这样的话,我们的计算机一般会有选择性的使用向上和向下舍入,但最终还是会向最接近的值舍入。这是IEEE采取的默认的舍入方式,因为这种舍入方式总是向最近的值的舍入,从而让我们的舍入更加精确。也就是大部分都是四舍五入,只有下面的一种是向零舍入。
浮点运算
这里我们需要知道:
- 浮点运算没有结合律和分配律,打个比方(3-3)+0.0000000000002=0.00000000000002,(3+0.0000000000002)-3=0,按照我们的数学来说很奇怪是不是?出现这个的原因,就是因为浮点数有着舍入与精度规则,第二个式子的值被抹去了。
对此推广开来,我们就可以知道一些问题:
- int转换成float,不会发生溢出,但是可能会发生舍入。
- double转换成int,与float,可能会发生溢出。
- 由浮点数转换为整数,float,double,转换成int会发生取舍,取舍规则为向零取舍,即小数点后面的数全部抹除