深入理解计算机系统(二)——信息的表示和处理
前言
当构造存储和处理信息的机器时,二进制工作得更好,因为二值信号进行存储和执行计算的电子电路非常简单可靠。
本章研究在计算机上如何表示数字和其他形式数据的基本属性,以及计算机对这些数据执行操作的属性,例如编码等。
信息存储
大多数计算机使用8位的块(字节byte)作为最小的可寻址的内存单位,而不是访问内存中单独的位。
机器级程序将内存视为一个非常大的字节数组,称为虚拟内存(virtual memory)。内存的每个字节都由一个唯一的数字标识,即为它的地址(address),所有可能的地址集合就组成了虚拟地址空间(virtual address space)。
十六进制表示法
太基础,不记录
字数据大小
字长(word size)指定指针数据的标称大小(normal size)。字长决定的最重要的系统参数就是虚拟地址空间的最大大小,因为虚拟地址是以这样的一个字来编码的。对于一个字长为w位的机器而言,虚拟地址的范围是0~2^w-1,程序最多访问2^w个字节。
图2-3展示了为C语言各种数据类型分配的字节数。其还展示了指针使用程序的全字长。大部分数据类型都编码为有符号数值,除非有前缀关键字unsigned或对确定大小的数据类型使用了特定的无符号声明。数据类型char例外,因为大多数情况下,程序行为对数据类型char是有符号还是无符号的不敏感。
寻址和字节顺序
对于程序对象,最重要的两个规则:这个对象的地址是什么?在内存中如何排列这些字节(大端序、小端序)?
一般多字节对象都被存储为连续的字节序列,对象地址为其中所使用字节中最小的地址。例如一个int类型的变量x地址为0x100,也代表x的4个字节将被存储在0x100、0x101、0x102、0x103。
小端序——在内存中按照从最低有效字节到最高有效字节的顺序存储对象。
大端序——在内存中按照从最高有效字节到最低有效字节的顺序存储对象。
假设变量x的类型为int,位于地址0x100处,其十六进制值为0x01234567。地址范围0x100~0x103的字节顺序取决于其是小端序还是大端序:
大多数Intel兼容机都只用小端模式。许多移动电话的ARM微处理器,这些芯片上的两种最火的操作系统——Android、IOS只能运行于小端模式。
表示字符串
C语言中字符串被编码为一个以null(值为0)字符结尾的字符数组。每个字都由某个标准编码来表示,最常见的是ASCII字符码。
ASCII字符集适合于编码英文文档,但是在表达希腊语、中文、俄语等语言的特殊字符却没有太多办法。因此后续又提出了很多方法对不同语言的文字进行编码。当前的Unicode标准字库包括将近100000个字符,支持很广泛的语言种类。
表示代码
对于下述C函数:
1 | int sum(int x, int y){ |
当在不同机器上编译时,生成的机器代码如下所示:
这说明:不同的机器类型使用不同且不兼容的指令和编码方式。相同的进程,在不同的操作系统上也有不同的编码规则,所以二进制代码是不兼容的,很少能在不同机器和操作系统组合之间移植。
这归根于,计算机系统的一个基本概念:从机器的角度看,程序仅仅只是字节序列。