注:第二章本人采取略读。涉及细节很多,基本是数字逻辑、计组里的内容:有无符号/整数/浮点数编码/位级运算,等等。
第二章 信息的表示和处理
- 浮点运算:由于表示的精度有限,浮点运算是不可结合的。
- 例如,在多数机器上,C表达式(3.14+1e20)-1e20求得的值是0.0,而3.14+(1e20-1e20)求得的值是3.14。
- 整数运算和浮点数运算有不同的数学属性,是因为它们处理数字表示有限性的方式不同
- 整数表示虽然只能编码一个相对较小的数值范围,但是这种表示是精确的;而浮点数虽然可以编码一个较大的数值范围,但是这种表示只是近似的。
- 大多数计算机使用8位的块,或者字节(byte),作为最小的可寻址的内存单位。
- 程序对象(program object):程序数据、指令和控制信息。
- 例如,C语言中一个指针的值(无论它指向一个整数、一个结构或是某个程序对象)都是某个存储块的
第一个字节
的虚拟地址
。- C编译器还把每个指针和类型信息联系起来,这样就可以根据指针值的类型,生成不同的机器级代码来访问存储在指针所指向位置处的值。
- 尽管C编译器维护着这个类型信息,但是它生成的实际机器级程序并不包含关于数据类型的信息。每个程序对象可以简单地视为一个字节块,而程序本身就是一个字节序列。
- 字长
- 字长(word size)指明指针数据的标称大小(nominal size)
- 对于字长为W位的机器而言,虚拟地址的范围为0 ~ $2^{W}-1$
- 32位字长机器,虚拟地址空间为4千兆字节(4GB)
- 32位/64位系统,数据类型长度、指针长度如下
- 字节顺序
- 字节的顺序存储:最低有效字节在最前面的方式,称为小端法(little endian),最高有效字节在最前面的方式,称为大端法(big endian)。
- 大多数Intel兼容机、Android(来自Google)和IOS(来自Apple)只能运行于小端模式。
- 字节顺序显得很重要,三种情况:
- 在不同类型的机器之间通过网络传送二进制数据时,发送方机器将它的内部表示转换成网络标准,接收方机器则将网络标准转换为它的内部表示。(第11章)
- 检查机器级程序时,阅读表示整数数据的字节序列(反汇编代码)
- 当编写规避正常的类型系统的程序时。比如,使用强制类型转换(cast)或联合(union)来允许以一种数据类型引用一个对象,而这种数据类型与创建这个对象时定义的数据类型不同。
- 表示字符串
- 在使用ASCII码作为字符码的任何系统上都将得到相同的结果,与字节顺序和字大小规则无关。因而,文本数据比二进制数据具有更强的平台独立性。
对于逻辑运算符&&和 ,如果对第一个参数求值就能确定表达式的结果,那么逻辑运算符就不会对第二个参数求值。