数据是指能够输入计算机并被计算机处理的数字、字母和符号的组合,在计算机内部,任何形式的数据都必须经过数字化编码后才能被传送、存储和处理。
在日常生活中,会遇到不同进制的数,如十进制数、逢十进一;一周有7天,逢七进一等。计算机中存放的是二进制数,为了书写和表示方便,还引入了八进制数和十六进制数。无论哪种数值,其共同之处都是进位计数制。
在采用进位计数制的数字系统中,如果只用r个基本符号表示数值,则称其为基r数制,r称为该数制的基数,而数值中每一固定位置对应的单位值称为权。表1-1是常用的几种进位计数制。
表1-1 常用的各种进位计数制的表示
进位制 |
二进制 |
八进制 |
十进制 |
十六进制 |
规则 |
逢二进一 |
逢八进一 |
逢十进一 |
逢十六进一 |
基数 |
r=2 |
r=8 |
r=10 |
r=16 |
基本符号 |
0,1 |
0,1,2,…,7 |
0,1,2,…,9 |
0,1,…,9,A,B,…,F |
权 |
2i |
8i |
10i |
16i |
表示形式 |
B |
O |
D |
H |
由上表可知,不同进制的数制有共同的特点:第一,采用进位计数制方法,每一种数值都有固定的基本符号,称为“数码”;第二,都使用位置表示法,即处于不同位置的数码所代表的值不同,与它所在的位置的“权”值有关。
例如,在十进制数值中,847.26可表示为:
847.26 = 8×102 + 4×101 + 7×100 + 2×10-1+ 6×10-2
可以看出,各种进位计数制中的权的值恰好是基数r的某次幂。因此,对任何一种进位计数制表示的数都可以写出按权展开的多项式之和,任意一个r进制数N可表示为:
N= an-1×rn-1+an-2 ×rn-2+ … +a1×r1+a0×r0+a-1×r-1+…+ a-m×r-m=
其中,ai是数码,r是基数,ri是权;不同的基数,表示不同的进制数。
(1)r进制数转换成十进制数。
展开式:
N=
计算机本身就提供了将r进制数转换成十进制数的方法。只要将各位数码乘以各自的权值累加即可。例如,将二进制数1001101.001转换成十进制数:
(1001101.001)B = 1×26 + 1×23 + 1×22 + 1×20 + 1×2-3=(77.125)D
例如,将八进制数526转换成十进制数:
(526)O = 5×82 + 2×81 + 6×80 = (322)D
(2)十进制数转换成r进制数。
将十进制数转换成r进制数时,可将此数分成整数与小数两部分分别转换,然后拼接起来即可。
整数部分转换成r进制数采用除r取余法,即将十进制整数不断除以r取余数,直到商为0,余数从右到左排列,首次取得余数排在最右。
小数部分转换成r进制数采用乘r取整法,即将十进制小数不断乘以r取整数,直到小数部分为0或达到要求的精度为止(小数部分可能永远得不到0);所得的整数从小数点自左往右排列,取有效精度,首次取得整数排在最左。
例如,将(120.675)D转换成二进制数:
整数部分 小数部分
2 120 取余数 0.675 取走整数
2 60 ……0 a0 低 ×2
2 30 ……0 a1 1.350 1 a-1 高
2 15 ……0 a2 ×2
2 7 ……1 a3 0.70 0 a-2
2 3 ……1 a4 ×2
2 1 …...1 a5 1.40 1 a-3
0 ……1 a6 高 ×2
0.80 0 a-4
×2
1.60 1 a-5 低
转换结果为:
(120.675)D =(a6 a5 a4 a3 a2 a1 a0. a-1a-2a-3a-4a-5)B =(1111000.10101)B
例如,将十进制数268.06转换成八进制数:
8 268 取余数 0.06
8 33 …… 4 ×8 取走整数
8 4 …… 1 0.48 0
0 ……4 ×8
3.84 3
×8
6.72 6
所以,(268.06)D =(414.036)O。
(3)二进制数、八进制数、十六进制数间的转换。
由上例看到,十进制数转换成二进制数过程书写较长;同样,二进制表示的数比等值的十进制数占更多的位数,书写较长,容易出错。为了方便起见,人们借助八进制数和十六进制数来进行转换和表示。转换时将十进制数转换成八进制数或十六进制数,再转换成二进制数。二进制、八进制和十六进制之间存在的关系如下:1位八进制数相当于3位二进制数,1位十六进制数相当于4位二进制数,如表1-2所示。
表1-2 八进制数与二进制数、十六进制数与二进制数之间的关系
八进制数 |
对应二进制数 |
十六进制数 |
对应二进制数 |
十六进制数 |
对应二进制数 |
0 |
000 |
0 |
0000 |
8 |
1000 |
1 |
001 |
1 |
0001 |
9 |
1001 |
2 |
010 |
2 |
0010 |
A |
1010 |
3 |
011 |
3 |
0011 |
B |
1011 |
4 |
100 |
4 |
0100 |
C |
1100 |
5 |
101 |
5 |
0101 |
D |
1101 |
6 |
110 |
6 |
0110 |
E |
1110 |
7 |
111 |
7 |
0111 |
F |
1111 |
根据这种对应关系,二进制数转换成八进制数时,以小数点为中心向左右两边分组,每3位为一组,两头不足3位补0即可。同样,二进制数转换成十六进制数只要4位为一组进行分组即可。
例如,将二进制数(1011010010.111110)B转换成十六进制数:
(0010 1101 0010. 1111 1000)B =(2D2.F8)H (整数高位和小数低位补0)
2 D 2 F 8
例如,将二进制数(1011010010.111110)B转换成八进制数:
(001 011 010 010. 111 110)B =(1322.76)O
同样,将八进制数、十六进制数转换成二进制数只要将1位转化为3位或4位即可。例如:
(3B6F.E6)H = (0011 1011 0110 1111. 1110 0110)B
3 B 6 F E 6
(6732.26)O = (110 111 011 010. 010 110)B
6 7 3 2 2 6
数在计算机中的表示统称为机器数。机器数有以下三个特点。
(1)数的符号数值化。在计算机中,因为只有0和1两种形式,为了表示数的正(+)、负(-)号,也必须以0和1表示。通常把一个数的最高位定义为符号位,用0表示正,1表示负,称为数符;其余位仍表示数值。若一个数占8位,则其表示形式如图1-1所示。
1 |
1 |
0 |
1 |
1 |
0 |
0 |
1 |
数符
图1-1 机器数
通常,把在机器内存放的正、负符号数值化的数称为机器数,机器数对应的数值称为机器数的真值数。例如,真值数(-1011001)B,其机器数为11011001,存放在机器中如图1-1所示。
(2)计算机中通常只表示整数和纯小数。因此,小数点约定在一个固定的位置上,不再占用1个数位。
(3)机器数表示的范围受到字长和数据的类型的限制。例如,若表示一个整数,字长为8位,最大值01111111,最高位是符号位,因此此数的最大值为127。若数值超出127,就要溢出。可以用浮点数来表示较大或较小的数。
定点数约定小数点隐含在某一固定的位置上,称为定点数表示法;浮点数是指小数点位置可以任意浮动,称为浮点数表示法。
(1)定点数表示法。
定点数表示法有两种约定,定点整数和定点小数。
定点整数约定小数点位置在机器数的最右边,如图1-2所示,定点整数是纯整数。
图1-2 定点数表示
定点整数分为带符号数和不带符号数两类。对带符号数的整数,符号位被放在最高位。整数表示的数是精确的,但数的范围是有限的。根据存放的数的字长,可以用8位、16位、32位等表示。当以补码形式表示时,各自表示的数的范围如表1-3所示。
表1-3 不同位数和数的表示范围
二进制位数 |
无符号整数的表示范围 |
有符号整数的表示范围 |
8 |
0~(28-1) |
-27~(27-1) |
16 |
0~(216-1) |
-215~(215-1) |
32 |
0~(232-1) |
-231~(231-1) |
例如,假定整数占8位,则数值-88存放的形式如图1-3所示。
1 |
1 |
0 |
1 |
1 |
0 |
0 |
0 |
图1-3 -88的存放形式
定点小数约定小数点位置在符号位、有效数值部分之间,定点小数是纯小数,即所有数均小于1。
(2)浮点数表示法。
定点数表示的数值范围在许多应用中是不够的,尤其在科学计算中,为了能表示特大或特小的数,采用“浮点数”或“科学表示法”表示。“浮点数”由两部分组成,即尾数和阶码,底数是事先约定的,在机器数中不出现。
例如,0.657×105,则0.657为尾数,5是阶码。
在浮点表示方法中,小数点的位置是浮动的,阶码可以取不同的数值。例如,十进制数-2346.4568可表示为-2.3464568×10+3、-2346.4568×100、-2346456.8×10-3等多种形式。为了便于计算机中小数点的表示,规定将浮点数写成规格化的形式,即尾数的绝对值大于等于0.1并且小于1,从而唯一地规定了小数点的位置。十进制数-2346.4568以规格化形式表示为:
-0.23464568×104
同样,任意二进制规格化浮点数的表示形式为:
N=
式中d是尾数,前面的“±”表示数符;p是阶码,前面的“±”表示阶符。它在计算机内的存储形式如图1-4所示。
阶符 |
阶码 |
数符 |
尾数 |
图1-4 任意二进制规整化浮点数的表示形式
阶码只能是一个带符号的整数,阶码本身的小数点约定在阶码的最右边;尾数表示数的有效部分,是纯小数,其本身的小数点约定在数符和尾数之间。由此可见,浮点数是定点整数占1位,阶码的位数表示数的大小范围,尾数的位数表示数的精度。
例如,设尾数为8位,阶码为6位,则下面的二进制浮点数的存放形式如图1-5所示。
N =(-1011.011)B = (-0.1011011)B×2(100)B
图1-5 N =(-1011.011)B浮点数的存放形式
从上述的机器数可知,数在存放时由数符位用0表示正数,1表示负数。若将符号位同时和数值参加运算,则会产生错误的结果。若考虑计算机结果的符号问题,将增加计算机实现的难度。例如,-6+2的结果应为-4,但在计算机中若按照上述的符号位同时和数值参加运算,则运算如下:
10000110 …… -6的机器数
+ 00000010 …… 2的机器数
10001000 ……. 运算结果为-8
若考虑符号位的处理,则运算将变得复杂。为了解决此类问题,在机器数中的负数有三种表示法:原码、反码和补码。
(1)原码。
整数X的原码指:其数符位0表示正,1表示负;其数值部分就是X绝对值的二进制表示。通常用[X]原表示X的原码。
例如,[+1]原= 00000001 [-1]原=10000001
[+127]原=01111111 [-127]原=11111111
在原码表示中,0有两种表示形式,即:
[+0]原= 00000000 [-0]原=10000000
由此可知,8位原码表示的最大值为127,最小值为-127,表示数的范围为-127~127。
原码表示法简单易懂,与其真值的转换方便,但当两个数做加法运算时,如果两数码符号相同,则数值相加,符号不变;如果两数码符号不同,数值部分实际上是相减,这时必须比较哪个数的绝对值大,才能决定运算结果的符号位及值。
(2)反码。
整数X的反码指:对于正数与原码相同;对于负数,数符位为1,其数值位X的绝对值取反。通常用[X]反表示X的反码。
例如,[+1]反= 00000001 [-1]反=11111110
[+127]反=01111111 [-127]反=10000000
在反码表示中,0也有两种表示形式,即:
[+0]反= 00000000 [-0]反=11111111
由此可知,8位反码表示的最大值、最小值和表示数的范围与原码相同。
(3)补码。
整数X的补码指:对于正数与原码相同;对于负数,数符位为1,其数值位X的绝对值取反最右加1,即反码加1。通常用[X]补表示X的补码。
例如,[+1]补= 00000001 [-1]补=11111111
[+127]补=01111111 [-127]补=10000001
在补码表示中,0有唯一的编码:
[+0]补= [-0]补= 00000000
因而可以用多出来的一个编码10000000来扩展补码所能表示数的范围,即将最小负数-127扩大到-128。这里的最高位既可以看成是符号位负数,又可以表示为数值位,其值为-128。这就是补码与原码、反码最小值不同的原因。
补码运算方便,二进制的减法运算可用补码实现,使用较为广泛。例如,5–9的运算如下:
00000101 ……5的补码
+ 11110111 ……-9的补码
11111100
运算结果为11111100,是-4的补码形式。
字符是计算机中使用最多的信息形式之一,它是人与计算机进行通信、交互的重要媒介。它包括了西文字符和中文字符。由于计算机是以二进制的形式存储和处理的,因此字符也必须按照特定的规则进行二进制编码才能进入计算机。
对西文字符编码最常用的是ASCII(American Standard Code for Information Interchange,美国信息交换标准代码)。ASCII用7位二进制编码,它可以表示27即128个字符,如表1-4所示。每个字符用7位基2码表示,其排列次序为d6d5d4d3d2d1d0,d6为最高位,d0为最低位。
表1-4 7位ASCII代码表
d6d5d4 d3d2d1d0 |
000 |
001 |
010 |
011 |
100 |
101 |
110 |
111 |
0000 |
NUL |
DLE |
SP |
0 |
@ |
P |
` |
p |
0001 |
SOH |
DC1 |
! |
1 |
A |
Q |
a |
q |
0010 |
STX |
DC2 |
“ |
2 |
B |
R |
b |
r |
0011 |
ETX |
DC3 |
# |
3 |
C |
S |
c |
s |
0100 |
EOT |
DC4 |
$ |
4 |
D |
T |
d |
t |
0101 |
END |
NAK |
% |
5 |
E |
U |
e |
u |
0110 |
ACK |
SYN |
& |
6 |
F |
V |
f |
v |
0111 |
BEL |
ETB |
, |
7 |
G |
W |
g |
W |
1000 |
BS |
CAN |
( |
8 |
H |
X |
H |
X |
1001 |
HT |
EM |
) |
9 |
I |
Y |
I |
Y |
1010 |
LF |
SUB |
* |
: |
J |
Z |
J |
Z |
1011 |
VT |
ESC |
+ |
; |
K |
[ |
K |
{ |
1100 |
FF |
FS |
‘ |
< |
L |
\ |
L |
| |
1101 |
CR |
GS |
- |
= |
M |
] |
M |
} |
1110 |
SO |
RS |
. |
> |
N |
↑ |
N |
~ |
1111 |
SI |
US |
/ |
? |
O |
↓ |
O |
DEL |
其中常用的控制字符的作用如下。
BS(Back Space):退格。 HT(Horizontal Table):水平制表。
LF(Line Feed):换行。 VT(Vertical Table):垂直制表。
FF(Form Feed):换页。 CR(Carriage Return):回车。
CAN(Cancel):取消。 ESC(Escape):换码。
SP(Space):空格。 DEL(Delete):删除。
在ASCII码表中看出,十进制码值0~32 和127(即NUL~SP和DEL)共34个字符,称为非图形字符(控制符);其余94个字符称为图形字符。
计算机的内部存储与操作以字节为单位,即以8个二进制位为单位。因此,一个字符在机算机内实际是用8位表示。正常情况下,最高位d7为0。在需要奇偶校验时,这一位可用于存放奇偶校验位的值,此时称该位为校验位。
西文字符除了常用的ASCII编码外,还有一种扩展的二—十进制交换码(Extended Binary Coded Decimal Interchange Code,EBCDIC),这种字符编码主要用在大型机器中。
EBCDIC码采用8位基2码表示,有256个编码状态,但往往只选用其中一部分。
输入码 |
国标码 |
机内码 |
地址码
|
字形码 |
汉字输入 汉字输出
图1-6 汉字信息处理系统的模型
(1)汉字输入码。
在机算机系统中使用汉字,首先遇到的问题是如何把汉字输入到计算机内。为了能直接使用西文标准键盘进行输入,必须为汉字设计相应的编码方法。汉字编码方法主要分为三类:数字编码、拼音码和字形编码。
数字编码就是用数字串代表一个汉字的输入,常用的是国标区位码。国标区位码根据国家标准局公布的6763个两级汉字(一级汉字有3755个,按汉语拼音排列;二级汉字有3008个,按偏旁部首排列)分成94个区,每个区分94位,实际上是把汉字表示成二维数组,区码和位码各两位十进制数字,因此,输入一个汉字需要按键4次。
拼音码是以汉语读音为基础的输入方法。由于汉字的同音字太多,输入重码率很高,因此,按拼音输入后还必须进行同音字选择,影响了输入速度。
字形编码是以汉字的形状确定的编码。汉字的总数虽多,但都是由一笔一画组成,全部汉字的部首和笔画是有限的。因此,把汉字的部首和笔画用字母或数字进行编码,按笔画书写的顺序依次输入,就能表示一个汉字。五笔字型、表形码等便是这种编码法。
(2)内部码。
内部码是字符在设备或信息处理系统内部最基本的表达形式,是在设备和信息处理系统内部存储、处理、传输字符用的代码。一个国标码占两个字节,每个字节最高位仍为0;英文字符的机内码是7位ASCII码,最高位也为0,为了在计算机内部能够区分是汉字编码还是ASCII码,将国标码的每个字节的最高位由0变为1,变换后的国标码成为汉字机内码,由此可知汉字机内码的每个字节都大于128,而每个西文字符的ASCII码值均小于128。以汉字“大”为例,国标码为3473H,机内码为B4F3H。
(3)字形码。
汉字字形码是表示汉字字形的字模数据,通常用点阵、矢量函数等方式表示。用点阵表示字形时,汉字字形码指的就是这个汉字字形点阵的代码。根据输出的汉字的要求不同,点阵的多少也不同。简易型汉字为16×16点阵,提高型汉字为24×24点阵、32×32点阵、48×48点阵等。
点阵规模愈大,字形愈清晰美观,所占用的存储的空间也愈大。以16×16点阵为例,每个汉字要占用32B存储空间,两级汉字大约占用256KB。因此,字模点阵用来构成“字库”,字库中存储了每个汉字的点阵代码,当显示输出时检索字库,输出字模点阵得到字形。