深入理解计算机系统(2)

时间:2023-02-05 16:15:10

本文我们要说一说计算机中信息的表示

一计算机信息的表示

我们在数学中学习的计算,都是基于十进制的。这种进制,是起源于印度,在12世纪时期流传到阿拉伯,在阿拉伯进行了改进,然后在13世纪传播到西方。这就是我们今天最广泛使用的阿拉伯数字,它包含0~9一共十个符号。

十进制的特点是,有10个不同的记号,遇到10的整倍数进位。

 

在构造存储和处理信息的机器时,不适于使用十进制,而适合使用二进制。它通过一些物质的物理特性,如电压的高或低,通电或者不通电,打孔带的有孔或者无孔等方式来记录信息。

二进制的特点是,有2个不同的记号,遇到2的整倍数进位。

这种简单的方式,对于工业制造提供了稳定的基础,现在的工艺,已经可以在一个芯片上集成千万级甚至亿级的电路了。

但是使用计算机所表示的信息,在进行数学计算时可能并不是那么精确。

首先计算机的数值计算是有范围的,超出范围就可能得到错误的结果;

其次计算机的计算是有精度限制的,超出精度就会出现误差;

最后计算机的计算并不符合某些数学定律。

因此我们要从计算机信息的存储入手,理解计算机的信息存储特点,以避免出现错误的计算。

二信息存储

为了计算机信息表示的方便,还经常使用八进制,十六进制。

十六进制的特点是,有16个不同的记号,遇到16的整倍数进位。

十六进制的符号,除了十进制的0~9之外,还包含,a,b,c,d,e,f等字符。每个字符,对应四位bit,例如十六进制的0Xf,用二进制表示,就是1111。即十进制的15。

 

我们在安装windows系统时,要分32位,64位。有些软件,也分32位,64位。那这个“位”到底是什么意思呢?

相对于32位技术而言,64位技术的这个位数指的是CPU GPRs(General-Purpose Registers,通用寄存器)的数据宽度为64位,64位指令集就是运行64位数据的指令,也就是说处理器一次可以运行64bit数据。

如果CPU是64位的,但是操作系统是32位的,那CPU的的性能就无法充分发挥出来,最直观的感觉就是,安装32位系统比64位系统还慢。当然这还要其他的硬件满足安装64位系统的基本要求。

32位和64位的系统,对于我们日常应用来说,32位系统,只能识别大概4G的虚拟地址空间,系统实际上可用内存为3.25G。而64位系统,理论上可以支持2的64次方的虚拟地址空间,但目前的系统最大支持128G的内存,而目前主流主板,一般支持到32G的内存。

 深入理解计算机系统(2)

这是我工作中用到的一台PC Server的配置。使用的是64位cpu,64位的系统,以及32G的内存。

在这里,我们需明确一个概念,就是机器字长:

32位系统,一个机器字长度是32bit;

64位系统,一个机器字长度是64bit。

 

对于C语言而言,每种数据都有其特定的类型,但数据本身都是由0,1组成的bit序列,那类型是怎么区分出来的呢?

其实不同的数据类型,除了上下文之外,只在长度上有区分。

下面列表列出了,C常见数值类型占用几个字符

C声明

32位系统(字符)

64位系统(字符)

Char

1

1

Short int

2

2

Int

4

4

Long int

4

8

Char*

4

8

Float

4

4

double

8

8

注意指针类型,无论指向的是什么具体类型,都占一个机器字长。

 

对于超过1个字符长度的数据类型,机器在实际存储的时候,有两种方式:

一种是小端法,一种是大端法。

所谓小端法,就是指这个数据的最低内存位置存储的是低有效位。

而大端法,就是表示这个数据的最低内存位置存储的是高有效位。

 

如果我们想让计算机存储一个字符串,需要对数据进行编码。编码的方式,最常用的,是用于表示英语字符的ASCII编码,

此外,还有一种比较通用的编码,就是Unicode编码。它的每个字符占16bit,即2个字节。它可以表示除英语之外很多国家的语言字符。

Java和.NET都是采用的这种字符集来编码的。

 

以前我们说过关于hello world程序的二进制表示。其实对于不同的机器,其二进制也是不同的,而且无法兼容。

因此如果想用一种语言进行程序编写,然后在不同架构不同系统的计算机上运行,就需要进行特殊处理。例如Java的JVM,就是可以将Java代码根据不同的机器架构编译成对应的机器代码序列。从而实现Java的“一次编译,到处运行”的跨平台性。

 

说完了数值和字符,下面说一说关于二进制的数学特性。

计算机存储数据是使用二进制,它与数学中的“布尔代数”非常相似。在布尔代数中,只有2个值:true或false。而计算机语言中,一般都包含一种称为Bool的数据类型。研究这种数据类型,对于我们学习计算机的存储和运算是有帮助的。

下图列出bool类型的一些数学特点。

 深入理解计算机系统(2)

 

在C语言中,对于数据可以进行如下三种布尔运算:

1按位布尔运算。

2逻辑运算与短路逻辑运算。

3移位运算:左位移运算,逻辑右位移运算,算术右位移运算。

 

这些运算在现在高级计算机语言中基本都有,其基本规则与C语言都基本是一致的。

 

三总结

本节主要讲了计算机的信息存储的形式,以及一些基本的运算特性。

计算机将信息编码为bit位的序列。有不同的编码方式用来表示整数,实数和字符串。不同架构的计算机在编码数字和多字节数据时所产生的bit序列是不同的。

布尔运算是计算机中的重要运算方式。