重读CSAPP 第一,二章总结

    自编程以来我便熟知大名鼎鼎的编程书<深入理解计算机系统>。去年这个时候曾尝试通读一遍,但并未深入。可以说是走马观花,浅尝辄止。今时今日,深感当初囫囵吞枣,未能仔细领悟书中之精髓。故决心重读,细细品读这部计算机科学领悟的经典入门之作。

   开篇第一章,正如开头所讲,从简单的HelloWorld程序开始,带我进行了一次计算机系统的漫游。在其中首先提到了信息的本质,简单总结为"位+上下文"。而后讲述了编译系统的大体流程,源程序是如何被编译成可执行的指令,在内存中被处理器逐步执行的。同时还讲解了高速缓存的意义,操作系统的构造层次以及网络通信的必要性。最后提到了Amdahl定律,阐述了并发和并行的概念,并且强调了抽象在计算机系统中的重要性。短短十几页内容,描绘了整个计算机系统的组成和意义。

  接下来便是第一部分的内容:程序构造和执行。

  第二章的标题为"信息的表示和处理"。本章从信息的存储出发,先讲述了信息在计算机系统中的表示。然后详细论述了整数,浮点数及他们在计算机系统中的运算方式和规则。接下来让我们详细解读第二章的内容。

    chapter 2.1 信息存储

    通常信息在计算机系统中以二进制数据存储,但是我们却不仅可以以二进制来解读信息,同样可以用八进制,十进制,十六进制等方式来读取信息。当然,既然可以用这么多种方式来解读同一段信息,那么不同进制间的相互转换就成为了必不可少的知识。接下来讲述的是c语言中的位运算,包括了逻辑运算和移位运算等。在c语言中由于包含了有符号数和无符号数,故对于不同的数据类型右移运算可分为逻辑右移和算术右移。在Java中,由于只包含了有符号数,故采用不同的右移符号来区分右移运算。

    chapter 2.2 整数表示

   在c语言中,存储方式也分为大端序和小端序。对于同一段存储在计算机系统中的数据举例来说,例如下面这段数据:

                0x12 34 56 78

    若以小端序来解释则值为0x78563412,若以大端序来解释则为0x12345678。同时整数的表示分为有符号数和无符号数两种。有符号数最高位为符号位,符号位为0代表正整数,符号位为1代表负整数。整数的编码方式有三种:原码,补码,反码。原码的最高有效位为符号位。补码和反码的最高有效位的权重分别为:-2^(w-1)和-(2^w - 1)。有符号数和无符号数虽然代表的值不同,但是他们的位模式是是相同的。故同一个位模式的整数在不同编码方式下的值可能不同。在c语言中,如果不仔细斟酌无符号数和有符号数的使用,很可能在无意间忽视了两种数据类型之间的隐式转换,造成不必要的错误。

    chapter 2.3 整数运算

    整数的加减可能会造成溢出,此时需要截断部分位来获取对应的结果。其中无符号数的加法在溢出时需要减去对应的位数的最大值。补码的加法不仅会造成正溢出也可能会造成负溢出,故比无符号数的加法多了一种情况。无符号数的乘法可简单描述为乘积对对应位数最大值取模。补码乘法则需要在计算对应的源码乘法之后将结果从无符号数转化成补码。同时补码乘以常数时,通常采用移位运算来完成以提高性能。

    chapter 2.4 浮点数

    浮点数在计算机系统中的表示遵从IEEE 754标准,以32位数为例,通常有1位符号位,8位阶码和23位尾数。根据浮点数表示的规则,可将浮点数分为三类:

    规格化数:阶码位不全为0或者1

    非规格化数:阶码数全为0

    特殊数:阶码数全为1

其中浮点数值得计算还涉及到"阶码偏置量"等概念,规格化数中,隐含尾数+1,非规格化数中,计算指数时采用1-bias,以补偿规格化数中的1。浮点数的运算由于引入了NaN的概念,故不具备结合性和分配性。同时浮点数虽然能表示的范围很大,但能够精确表示的数值较少。浮点数的运算是设计计算系统中颇具挑战的一部分。

    chapter 2 习题/lab

    第二章的习题和lab涉及到整数的位运算以及浮点数的转化问题。其中最为经典的一道题莫过于计算二进制数中包含1的个数的奇偶性。相信但凡认真思考过课后习题的读者,关于c语言中位运算的技巧和浮点数的表示都会有一个显著的提升。

         

    

猜你喜欢

转载自blog.csdn.net/javainmyheart/article/details/80574690