Computer Systems:A Programmer's Perspective

深入理解计算机系统(第二章)

Posted by LT on July 10, 2020

注:第二章本人采取略读。涉及细节很多,基本是数字逻辑、计组里的内容:有无符号/整数/浮点数编码/位级运算,等等。

第二章 信息的表示和处理

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