月度归档:2018年10月

深入理解计算机系统(第三版)/ CSAPP 杂谈,第2章:信息的表示和处理

Published / by sickworm / Leave a Comment
  • gcc编译可以用 -std 和-ansi 来选择C语言规范版本,默认-std=c89,外加一些C99,C11特性

  • 大小端可通过 int* 强转为 char* 来判断得出

  • 一般C语言的 char 范围是-128~127,但其实C语言规范只要求最小的可取值范围为-127~127。类似还有 short,int,long,不过它们字节数要求是16位机器的要求。int32_t,int64_t C语言规范要求和C语言实现基本一致。#无用但有趣的冷知识

  • #define INT_MAX 2147483647
    #define INT_MIN (-INT_MAX – 1)
    这里没有简单地将INT_MIN赋值成-2147483647,是因为-2147483648对于编译器而言是个表达式,而2147483648对于32-bit整数是无法表示的

  • 扩展数字:有符号转无符号,按bit解析;扩展字节,正数补0,负数补1

  • 截断数字:无符号转有符号,按bit解析;压缩字节,保留符号位,其他直接截取

—- 2018.10.23 —-

  • 补码乘法:将补码看作无符号正整数,相乘后截断结果,结果即为乘法结果。e.g.

(13 x -7) mod 2^8 = -91 = 10100101

-7 = 11111001b = 249(看作无符号)

(12 * 249) mod 2^8 = 165 = 10100101 = -91(看作补码)

  • 浮点数基本都按照IEEE 754规范实现。1位用于表示正负,k位用于表示尾数,代表精度为1/2^k,n位表示阶码,代表绝对值取值范围为1 * 2^-(n-1) – 1, 2^(n-1)),分别是阶码取1和2^n-1时的值。尾数可任意取值时,绝对值范围为[1 * 2^-(n-1) – 1, 2 * 2^(n-1)))。阶码全0全1另有它用。具体看图2-36。

  • 单精度浮点数符号位 1,尾数位23,阶数位8;双精度位1,52,11。所以单精度的精度为1/2^23,绝对值取值范围为[2^-126,2^127]。尾数默认第一位为1,这样可以不存储在bits中,从而提高一位精度。但也因此不能表示0(阶码全0可表示)。

  • 阶码全0时可用于表示0,此时还会有+0.0和-0.0。阶码全1,尾数全0可表示正无穷和负无穷。尾数非全零表示NaN(Not a number)。

版权所有,转载请注明出处:
https://sickworm.com/?p=450

深入理解计算机系统(第三版)/ CSAPP 杂谈,第1章:计算机系统漫游

Published / by sickworm / Leave a Comment

本书第1章向我们介绍了信息的定义,以及程序是如何运行在计算机上的。

信息就是位+上下文

信息的本体是一连串的0101010101的bits,但是bits可以被解析为不同的含义,如何被解析就取决于上下文。

举个生活中的例子。“你好烦啊”如果是在一对情侣的温馨时刻中出现,那这句话可以被理解为“你个烦人的小妖精搞得我不要不要的”。而如果出现在母亲指责孩子,并且喋喋不休的情景下孩子的顶嘴,就应该理解为“你不要再说了我听不进去”。这就是上下文的作用,同样的内容,会被解析为不同的信息。

本文用到的例子是一串bits,如果代码想解析你为无符号整数,那这串bits就是正整数的信息;如果想解析为浮点数,那就是小数的信息,且与正整数代表的值可能完全不一样了。放大一点说,代码执行时当前的寄存器值,全局变量的值,栈帧的状态;程序运行时内存缓存的值,数据库的数据,都是它们的上下文。

程序的编译

现代编程语言具有很高的抽象程度,这是为了让人们更高效率的编写业务逻辑。而所有的程序代码都会在最终以机器码的形式执行,因为计算机只认识机器码。程序代码转换为机器码的过程大致都是如下的流程:

预处理:解掉一些语法糖,和调整部分代码,使其更方便的被编译器编译

编译器:将预处理后的代码进行编译,得到中间代码。中间代码不一定是汇编语言,也可能是C语言或其他语言,这取决于编译器的实现,一切为了效率。近几年比较流行的llvm,很多语言都基于它实现了编译器,而llvm也有它专用的中间语言IR。

汇编器:如果你实现的中间语言是汇编,那就是汇编器,否则就是其他器。这部将中间语言转换为可执行代码。可执行代码可能是计算机机器码,也有可能是某些依赖虚拟机的语言的虚拟机机器码。

链接器:代码以文件为单位进行编译。如果引用了文件外的方法,变量,则会在编译时留下一个“接口”,因为它暂时无法被确定。在链接阶段将会确定这些“接口”。

系统的硬件组成

讲了系统的硬件组成,直接看就行。比较有意思的是多层缓存机制。

进程,文件,网络,并发和并行

讲了计算机的一些代码执行和IO通信的机制。

版权所有,转载请注明出处:
https://sickworm.com/?p=440