在计算机中,数据都是以二进制的形式存在的(即都是以0和1组成的各种编码)。 而在计算机中之所以使用二进制,主要考虑了以下两点:
- 计算机是由逻辑电路组成,逻辑电路通常只有两个状态,开关的接通与断开,这两种状态正好可以用‘1’和‘0’来表示;
- 二进制运算规则简单,则其运算器的结构也较为简单,有利于提高运算速度;
1.进制转换
计算机中使用的是二进制,但现实生活中,人们使用的更多的是十进制。所以在计算机输出时,一般需要把二进制转换成十进制或其他进制。目前,人们常用的除二进制和十进制外,还有八进制和十六进制。
(1)数制的概念
数制也称计数制,是用一组固定的符号和统一的规则来表示数值的方法。数制中比较重要的概念包括数码、基数和位权,下面分别介绍如下:
- 数码,数制中表示基本数值大小的不同符号字符。比如,十进制有10个数码:0、1、2、3、4、5、6、7、8、9;
- 基数,数制所使用的数码的个数。比如,十进制的基数为10;
- 位权,数制中某一位上的1所表示数值的大小(可以理解为所处位置的价值)
比如:十进制的847.36,其中的8所处位置的位权是100,其中的4所处位置的位权是10,其中的7所处位置的位权是1, 其中的3所处位置的位权是0.1,其中的6所处位置的位权是0.01;
一般而言,我们可以用公式来表示某一个数值。任意一个R进制的数D可以表示为:
其中,R为基数,即“逢R进一”;i为位数,即在数值中的第几位(整数的最后一位是0位数,向左依次加1,向右,小数点后面的依次减1);Ki为第i位上的数码(其值为0至K-1中的任一个);Ri为第i位的位权。m和n为最低位和最高位的位数。举上个例子847.36,用该公式可以写成:
需要说明的是此数值中 8的位数为2;位权为102;
4的位数为1;位权为101;
7的位数为0;位权为100;
3的位数为-1;位权为10-1;
6的位数为-2;位权为10-2;
常用进制的各个要素如下表:
数制 | 基数 | 数码 | 位权 | 进位规则 | 简要表示 |
二 进 制 | 2 | 0,1 | 2i | 逢二进一 | (Binary) B或2 |
八进制 | 8 | 0,1,2,3,4,5,6,7, | 8i | 逢八进一 | (Octal) O或8 |
十进制 | 10 | 0,1,2,3,4,5,6,7,8,9, | 10i | 逢十进一 | (Decimal) D或10 |
十六进制 | 16 | 0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F | 16i | 逢十六进一 | (Hexadecimal) H或16 |
表2.1.14
例如:(5264)8 或5264O 表示的是一个八进制数;
(1ABC)16或1ABCH 表示的是一个十六进制数;
需要说明的是,十六进制比较特殊,它的数码中除了数字(0~9)外,还包含了6个英文字母(A~F)
(2)二进制和十进制的互换
各种数制之间是可以相互转换的,比如(110)2的二进制数,转换成十进制的数就是6。下面主要介绍二进制与十进制之间的转换方法,其他进制与十进制的转换方法类似。
<1>二进制转换为十进制
二进制转换为十进制,就是按公式展开,
(其中R为2)。
比如:
<2>十进制转换为二进制
将十进制转换为二进制时,需要先分成整数部分和小数部分,然后分别转换。
- 整数部分,把整数部分除2,得出商和余数,然后对商除2,又得出商和余数,继续对商除2,直至商为0。最后将按顺序得出的余数逆序排列,此排列数就是转换后的二进制数据。
比如:整数13,转换二进制的过程如下:
步骤 | 整数或商除2 | 商 | 余数 |
1 | 13÷2 | 6 | 1 |
2 | 6÷2 | 3 | 0 |
3 | 3÷2 | 1 | 1 |
4 | 1÷2 | 0 | 1 |
表2.1.15
按步骤顺序得出的余数,逆序排列得出 1101,此即为转换后的二进制数。
- 小数部分,把小数部分乘2,得出一个数据,分别取该数据的整数部分和小数部分。在对小数部分乘2,得出数据后,分别取出整数部分和小数部分。继续对小数部分乘2,直至取到的小数部分为0。最后将按顺序得到的整数部分排列,此排列数就是转换后的二进制数据。
比如:小数0.25,转换二进制的过程如下:
步骤 | 小数部分乘2 | 结果中的整数部分 | 结果中的小数部分 |
1 | 0.25×2 | 0 | 0.5 |
2 | 0.5×2 | 1 | 0 |
表2.1.16
按步骤顺序取出整数部分排列01,0.01即为转换后的二进制数。
综上,十进制数13.25的二进制表示为(1101.01)2
2.数据表示
我们知道,在计算机中的数据是用二进制来表示的。但现实中的正数和负数的概念又是在如何在计算机中表示的呢。其实,计算机中的数据分为无符号数和有符号数两种。
(1)无符号数
所谓的无符号数,其实就是在计算机中的二进制表示中没有符号位。每一位数码都表示数值本身。比如二进制(11010)2表示的十进制就是26。
(2)有符号数
在现实中,我们通常用”+”表示是正数,用字符”-”来表示负数。比如-123、+456.8(当然现实中的”+”在表示正数时,一般会省略掉)。但是在计算机中,数的正负标识(+、-)是无法直接识别的,所以在计算机中一般会使用0和1来代表正负(0代表正数,1代表负数)。此时在表示有符号的数值时,则需要一个符号位来表示正负。比如(011010)2表示的十进制数为+26.其在计算机内部表示如下图,最高位是一个符号位。
图2.1.12 有符号数的表示
一般的,我们把用”+”和”-”符号表示正负的数据,称为真值(比如+11010,就是一个真值)。相对应的,我们把在计算机中用0和1来代替正负表示的二进制数据称为机器数(比如0,11010,就是一个机器数,最左边的0代表符号位)。而机器数又根据编码规则不同,可以分为原码、反码、补码和移码等。介绍如下:
原码 | 机器数中最简单的编码方式,符号位0表示正数,1表示负数。比如: 正的二进制数11010的原码表示为0,11010(其中逗号左边表示符号位,右边表示数值位) 负的二进制数11010的原码表示为1,11010 |
反码 | 正数的反码与其原码相同。负数的反码是其原码除符号位外,其余各数值位取反(所谓的取反,就是1变成0,而0变成1).比如: 正的二进制数11010的反码表示为0,11010 负的二进制数11010的反码表示为1,00101 |
补码 | 正数的补码与其原码相同。负数的补码是在其反码的数值位的最低位+1。比如: 正的二进制数11010的补码表示为0,11010 负的二进制数11010的补码表示为 (1,00101)反码+1= 1,00110 |
移码/ 偏移码 | 无论正负数,移码就是将其补码的符号位取反。比如: 正的二进制数11010的移码表示为1,11010 负的二进制数11010的移码表示为0,00110 |
总结:
|
表2.1.17
3.定点数与浮点数
在计算机中,并没有专门的器件来表示小数点。针对非整数的情况,有两种方法来表示小数点的存在,即定点表示和浮点表示。定点表示的数称为定点数,浮点表示的数则被称为浮点数。
(1)定点数
定点数就是约定小数点固定在某一位置上的数。一般有两种约定:一种是约定小数点在符号位之后,最高数值位之前,用这种方法表示的数据为纯小数;一种是约定小数点在最低数值位之后,用这种方法表示的数据为纯整数。采用定点数的机器称为定点机。
或
图2.1.13 定点数的表示方法
在定点机中,当处理的数既不是纯小数或纯整数的时候,需乘上一个比例因子。
(2)浮点数
一般情况下,计算机处理的数据既不是纯小数,也不是纯整数,所以用定点方法表示是非常不方便的。而此时用浮点法表示,则会比较容易实现。所谓的浮点法就是小数点的位置不是固定的,而是根据情况可以发生浮动变化的。浮点数的表示形式如下图所示:
图2.1.14 浮点数的表示方法
浮点数有两部分组成,阶码和尾数。阶码是纯整数,由符号位和数值位来反映浮点数的表示范围和小数点的实际位置;尾数是纯小数,其数值位反映了浮点数的精度,符号位代表了浮点数的正负。假设浮点数总位数为16位。阶码8位(含符号位1位),位数8位(含符号位一位),如下图所示:
图2.1.15 浮点数的表示示例
该图所代表的数值为+0.0011010 × 2 -0001101 ,转化为十进制就是+0.203125 × 2-13。由此可见,阶码决定了2的多少次冪次方。一旦浮点数的总位数确定,那么如何分配阶码和尾数的位数,则直接影响浮点数的表示范围和精度。
为了提高浮点数的精度,浮点数的尾数必须是规格化数(所谓的规格化数,就是尾数中的数值位的最高位必须为有效数字,即必须为1)。如果不是规格化数,则要通过修改阶码并同时左右移尾数的办法,使其变成规划化数。而这个过程就称为浮点数的规格化。比如:二进制数0.0000101可以表示为0.000101×2-001,也可以表示为0.0101×2-110,当然也可以表示为0.101×2-111;而这其中只有0.101×2-111是规格化的数据。