《深入理解计算机系统》读书札记(第二章)
原书网盘链接地址:https://pan.baidu.com/s/1kF1Q9TloZzzgXewv7atWBw
提取码:gtt1
第二章 信息的表示和处理
现代计算机存储和处理的信息以二值信号表示(二进制,bit)。
三种重要的数字表示,计算机通过使用这些不同的表示方法实现算数运算。
- 无符号(unsigned)编码基于传统的二进制表示法,表示大于或者等于零的数字。
- 补码(two’s-complement)编码是表示有符号整数(为正或者为负的数字)。
- 浮点数(floating-point)编码是表示实数的科学计数法的以2为基数的版本。
2.1 信息存储
大多数计算机以字节(byte)作为最小的可寻址的内存单位。
机器级程序将内存视为一个非常大的数组,称为虚拟内存(virtual memory)。内存的每个字节都由一个唯一的数字来标识,称为地址(address),所有的可能地址的集合称为虚拟地址空间(virtual address space )
2.1.1 十六进制表示法
十六进制(hexadecimal)使用数字0-9以及字符A-F来表示16个可能的值。
在C语言中,常以0x或者0X开头的数字常量表示十六进制的值。
2.1.2 字数据大小
每台计算机都有一个字长(word size),指明指针数据的标称大小(nominal size)。因为虚拟地址是以这样的一个字来编码的,所以字长决定的最重要的系统参数就是虚拟地址空间的大小。
2.1.3 寻址和字节顺序
在几乎所有的机器上,多字节对象都被存储为连续的字节序列,对象的地址为所使用字节中最小的地址。
排列表示一个对象的字节有两个通用的规则:
- 小端法(little endian):内存中按照从最低有效字节到最高有效字节的顺序存储对象;
- 大端法(big endian):内存中按照从最高有效字节到最低有效字节的顺序存储对象;
2.1.4 表示字符串
C语言中字符串被编码为一个以null(其值为0)字符结尾的字符数组。
ASCII字符集适合于编码英语文档,JAVA编程语言使用Unicode来表示字符串。
2.1.5 表示代码
即使完全一样的进程,运行在不同的操作系统上也会有不同的编码规则,因此二进制代码是不兼容的。二进制代码很少能在不同机器和操作系统之间移植。
2.1.6 布尔代数简介(位级运算)
布尔代数:1850年前后,乔治布尔注意到通过将逻辑值TRUE(真)和FALSE(假)编码为二进制值1和0,能够设计出一种代数,以研究逻辑推理的基本原则。
- 与 (OR |)当P或者Q都为真时,则最终结果为真,当P=1或者Q=1时,P|Q=1;
- 或(AND &)当P和Q都为真时,则最终结果为真,当P=1且Q=1时,P&Q=1;
- 非(NOT !) 当P不是true,非true是真,当P等于0时,非P等于1,反之亦然;
- 异或(^)当P或者Q为真但不同时为真,P ^Q为真,当P=1且Q=0时,或者P=0且Q=1时,P ^Q=1;
我们可以将上述4个布尔运算拓展到位向量的运算。
2.1.7 C语言中的位级运算
2.1.8 C语言中的逻辑运算
逻辑运算符|| && ! 分别对应 OR ,AND NOT ,逻辑运算和位运算是不同的概念,逻辑运算认为非0的参数都表示TRUE,而参数0表示FALSE。逻辑运算符并且具有短路机制。
2.1.9 C语言中的移位运算
2.2 整数表示
2.2.1 整型数据类型
略
2.2.2 无符号数的编码
略
2.2.3 补码编码
原码、反码、补码知识详细讲解(此作者是我找到的讲的最细最明白的一个)
2.2.4 有符号数和无符号数之间的转换
略
2.2.5 C语言中的有符号数和无符号数
略
2.2.6 拓展一个数字的位表示
略
2.2.7 截断数字
略
2.2.8 关于有符号数和无符号数的建议
略
2.3 整数运算
略
2.4 浮点数
略