本文我们要说一说计算机中信息的表示
一计算机信息的表示
我们在数学中学习的计算,都是基于十进制的。这种进制,是起源于印度,在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的内存。
这是我工作中用到的一台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类型的一些数学特点。
在C语言中,对于数据可以进行如下三种布尔运算:
1按位布尔运算。
2逻辑运算与短路逻辑运算。
3移位运算:左位移运算,逻辑右位移运算,算术右位移运算。
这些运算在现在高级计算机语言中基本都有,其基本规则与C语言都基本是一致的。
三总结
本节主要讲了计算机的信息存储的形式,以及一些基本的运算特性。
计算机将信息编码为bit位的序列。有不同的编码方式用来表示整数,实数和字符串。不同架构的计算机在编码数字和多字节数据时所产生的bit序列是不同的。
布尔运算是计算机中的重要运算方式。