深入了解计算机系统——第一部分 程序结构和执行——第二章 信息的表示和处理——2.1信息存储

第二章 信息的处理和表示

本章我们研究三种最重要的数字表示

1 无符号(unsigned)编码基于传统的二进制表示法,表示大于或等于零的数字。

2 补码(two’s-complement)编码是表示有符号整数的最常见的方式,有符号整数就是可以为正或负的数字。
3 浮点数(floating-point)编码是表示实数的科学计数法以2为基数的版本。

2.1 信息存储

大多数计算机使用八位的快,或称字节(byte)作为最小的可以寻址的内存单位,而不是访问内存中单独的位。

机器级程序将内存视为一个非常大的字节数组,成为虚拟内存(virtual memory)。内存的每个字节都由一个唯一的数字来标识,称为他的地址(address),所有的可能的地址集合就称为虚拟地址空间(virtual memory address)。

C语言中一个指针的值(无论它指向一个整数,一个结构或是某个其他程序对象)都是某个存储块的第一个字节的虚拟地址。C语言还把每个指针和类型信息联系起来,这样就可以根据指针值的类型,生成不同的机器级代码来访问存储在指针所指向位置处的值。

接下来简单阐述一下 字 字节 字长 的定义。

1 计算机中的字指的是 计算机一次并行处理的一组二进制数。

2 字长 处理的二进制数的位数称为字长。

3 字节 数据存储是以字节为单位 8个位为一个字节。

接下来举三个例子:
486微机 4个字节 字长32
286微机 2个字节 字长16
Digital Equipment 公司的 Alpha AXP 8个字节 字长64位

2.1.1 十六进制表示法

深入了解计算机系统——第一部分 程序结构和执行——第二章 信息的表示和处理——2.1信息存储
在C语言中,以0x或0X开头的数字常量被认为是十六进制的值。字符’A’——‘F’既可以是大写,也可以是小写,甚至可以是大小写组合。

编写机器级程序的一个常见任务就是在位模式的十进制,二进制和十六进制表示之间人工转换。

十六进制转换为二进制最为简单直接,可以一次执行一个十六进制数字的转换。
对于二进制转换为十六进制,应该首先把它分为四个一组,注意如果位总数不是四的倍数,最左边一组可以少于四位,前面的用0补足。

深入了解计算机系统——第一部分 程序结构和执行——第二章 信息的表示和处理——2.1信息存储
特有的,当值x是2的非负整数n次幂时,也就是x=2^n, x的二进制表示就是1后面跟n个0.十六进制数字零。所以,当n可以表示成i+4j的形式,其中0<=i<=3时我们可以把写成开头的十六进制数字为1(i=0), 2 (i=1),4 (i=2),8 (i=3),后面跟着j个十六进制的0。

例如x=2048=2^11
n=11=3+2*4
x的十六进制表示为0x800

十进制和十六进制之间的转换反复使用乘法和除法即可处理一般情况(与十进制和二进制的转换方式相同,在此不在赘述)。