1.计算机中数据的单位
(1)位(bit)
位简记为b,也称为比特,是计算机存储数据的最小单位。一个“比特”也可以说成“位”,一个二进制位只能表示0或1。
(2)字节(byte)
字节由8位二进制数字构成,一般用大写的“B”表示“byte”,字节是存储信息的基本单位,并规定1B=8bit。
(3)字(Word)
一个字通常由一个字节或若干个字节组成。字节是微型计算机一次所能处理的实际位数长度。
(4)十六进制数字的表示
十六进制数的表示,即后面跟随“H”或“h”后级的数字,或者前面加“0x”或“0X”前级的数字表示是一个十六进制数。
2.数制
计算机只能识别二进制数。用户通过键盘输入的十进制数字和符号命令,计算机是不能识别的,计算机必须把它们转换成二进制形式才能识别、运算和处理,然后再把运算结果还原成十进制数字和符号,并在显示器上显示出来,所以需要对计算机常用的数制和数制间的转换进行讨论。
所谓数制是指计数的规则,按进位原则进行计数的方法,成为进位计数制。数制有很多种,计算机编程时常用的数制为二进制、八进制、十进制和十六进制。
(1)十进制(decimal)
十进制由0~9十个数码组成。十进制的基数是10,低位向高位进位的规律是“逢十进一”。十进制数的主要特点:
1)有0~9十个不同的数码,这是构成所有十进制数的基本符号。
2)逢10进位。十进制在计数过程中,当它的某位计数满10时就要向它邻近的高位进一。
在一个多位的十进制数中,同一个数字符号在不同的数位所代表的数值是不同的。因为,任何一个十进制数不仅与构成它的每个数码本身的值有关,而且还与这些数码在数中的位置有关。如333.3中4个3分别代表300、30、3和0.3,这个数可以写成:
333.3=3×10 2 +3×10 1 +3×10 0 +3×10 -1
式中的10称为十进制的基数,指数10 2 ,10 1 ,10 0 ,10 -1 称为各数位的权。从上式可以看出:整数部分中每位的幂是该位位数减1;小数点后第一位的位权是10 -1 ,第二位的位权是10 -2 ,……,其余位的位权以此类推。
通常,任意一个十进制数 N 都可以表示成按权展开的多项式:
式(1-1)中, a i 是基数10的 i 次幂的系数,是0~9共10个数字中的任意一个, m 是小数点右边的位数, i 是位数的序数。
一般而言,对于 R 进制表示的数 N ,可以按权展开为
其中, a i 是0、1、…、( R -1)中的任一个, m 、 n 是正数, R 是基数。在 R 进制中,每个数字所表示的值是该数字与它相应的权 R i 的乘积,计数原则是“逢 R 进一”。
(2)二进制(binary)
二进制数的主要特点:
1)它有0和1两个数码,任何二进制都是由这两个数码组成。
2)二进制数的基数为2,它奉行“逢二进一”的进位计数原则。
当式(1-1)中 R =2时,称为二进制计数制,简称二进制。在二进制数中,只有两个不同码数:0和1,进位规律为“逢二进一”。任何一个数N,可用二进制表示为
例如,二进制数1011.01可表示为
(1011.01) 2 =1×2 3 +0×2 2 +1×2 1 +1×2 0 +0×2 -1 +1×2 -2
(3)八进制
当 R =8时,称为八进制。在八进制中,有0、1、2、…7共8个不同的数码,采用“逢八进一”的原则进行计数。例如,(503) 8 可表示为
(503) 8 =5×8 2 +0×8 1 +3×8 0
(4)十六进制(hexadecimal)
当 R =16,称为十六进制数。十六进制数的主要特点:
1)它有0、1、2、3、…、D、E、F共16个数码,任何一个十六进制都由其中的一些或全部数码构成。
2)十六进制的基数为16,进位方式为逢16进1。
十六进制数也可展开成幂级数形式。例如,(3AB.0D) 16 可表示为:
(3AB.0D) 16 =3×16 2 +10×16 1 +11×16 0 +0×16 -1 +13×16 -2
各种进制的对应关系见表1-1。
表1-1 十、二、八、十六进制的对应关系
3.不同进制之间的转换
计算机中数的表示形式是二进制,这是因为二进制只有0和1两个数码,可通过晶体管的导通和截止、脉冲的高电平和低电平等方便地表示。此外二进制数运算简单,便于用电子线路实现。在实际编程的过程中,采用十六进制可以大大减轻阅读和书写二进制数时的负担。
例如,11011011=DBH、1001001111110010B=93F2H。
显然,采用十六进制数描述一个二进制数特别简短,尤其在描述的二进制数位数较长时,更令计算机工作者感到方便。
但人们习惯于使用十进制数,为了方便各种应用场合的需要,要求计算机能自动对不同数制的数进行转化。
(1)二进制、八进制、十六进制数转化为十进制数
对于任何一个二进制数、八进制数、十六进制数,均可以先写出它的位权展开式,然后再按十进制进行计算,即可将其转换为十进制数。
例如,二进制数转化为十进制数:
(1111.11) 2 =1×2 3 +1×2 2 +1×2 1 +1×2 0 +1×2 -1 +1×2 -2 =15.75
八进制数转换为十进制数:
(46.12) 8 =4×8 1 +6×8 0 +1×8 -1 +2×8 -2 =38.15625
十六进制转换为十进制数:
(A10B.8) 16 =10×16 3 +1×16 2 +0×16 1 +11×16 0 +8×16 -1 =41227.5
(2)十进制数转换成二进制数、八进制数、十六进制数
本转换过程是上述过程的逆过程,但十进制整数和小数转换成二进制、八进制、十六进制整数和小数的方法是不同的,现分别进行介绍。
1)整数部分:除基取余法。分别用基数 R 不断地去除 N 的整数,直到商为零为止,每次所得的余数依次排列即为相应进制的数码。最初得到的为最低有效数字,最后得到的为最高有效数字。现列举加以说明。
【 例题1-1 】试求出十进制数100的二进制数、八进制数和十六进制数。
解:① 转化为二进制数:
把100连续除以2,直到商数小于2,相应的有
把所得余数从高位到低位排列起来便可以得到:100=1100100B。
② 转化为八进制数:
把100连续除以8,直到商数小于8,相应的有
把所得余数从高位到低位排列起来便可以得到:100=144O。
③ 转化为十六进制数:
把100连续除以16,直到商数小于16,相应的有
把所得余数从高位到低位排列起来便可以得到:100=64H
2)小数部分:乘基取整法。分别用基数 R ( R =2、8或16)不断地去乘 N 的小数,直到积的小数部分为零(或满足所需精度)为止,每次乘得的整数依次排列即为相应进制的数码。最初得到的为最高有效数字,最后得到的为最低有效数字。
【 例1-2 】试求出十进制数0.645的二进制、八进制数和十六进制数。
解:① 转化为二进制数:
把所得整数按从高位到低位排列后得到:0.645D≈0.1010011B。
② 转化为八进制数:
把所得整数按从高位到低位排列后得到:0.645D≈0.51217O。
③ 转化为十六进制数:
把所得整数按从高位到低位排列后得到:0.645D≈0.A52EBH。
3)对同时有整数和小数两部分的十进制数,在转化为二进制、八进制和十六进制时,其转换的方法是:先对整数和小数部分分开转换后,再合并起来。
(3)二进制数和八进制数的转换
由于2的3次方是8,所以可采用“三合一”的原则,即从小数点开始分别向左、右两边各以3位为一组进行二进制到八进制数的转换:若不足3位的以0补足,便可将二进制数转换为八进制数。
反之,采用“一分为三”的原则,每位八进制数用三位二进制数表示,就可将八进制数转换为二进制数。
【 例1-3 】将二进制数1011010101.01111B转换成八进制数。
所以,1011010101.01111B=1325.36O。
例题:将八进制数472.63转换成二进制数。
所以,472.63O=100111010.110011B。
(4)二进制数和十六进制数的转换
由于二进制数和十六进制数间的转换十分方便,再加上十六进制数在表达数据时形式简单,所以编程人员大多采用十六进制数的形式来代替二进制数。
二进制数和十六进制数间的转换同二进制数和八进制数之间的转换一样,采用“四位合一位法”,即从二进制的小数点开始,分别向左、右两边各以4位为一组,不足4位以0补足,然后分别把每组数用十六进制数码表示,并按序相连。
而十六进制数转换成二进制数的转换方法采用“一分为四”的原则,即把十六进制数的每位分别用4位二进制数码表示,然后分别把它们连成一体。
【 例1-4 】将二进制数1011010101.01111B转换成十六进制数。
所以,1011010101.01111B=2D5.78H。
【 例1-5 】将十六进制数EF8.7D转换成二进制数。
所以,EF8.7D=111011111000.01101101B。
4.编码
计算机不仅要识别人们习惯的十进制数、完成数值计算问题,而且要处理大量文字、字符和各种符号(标点符号、运算符号)等非数值计算问题。这就要求计算机必须能够识别它们。也就是说,字符、符号和十进制数最终都要转换为二进制格式的代码,即信息和数据的二进制编码。
根据信息对象的不同,计算机中的编码方式(码制)也不同,常见的码制有BCD码和ASCII码。
(1)BCD码
为了在计算机的输入输出操作中能直观迅速地与常用的十进制数相对应,习惯上用二进制代码表示十进制数,这种编码方法简称BCD码(Binary Coded Decimal),其与十进制数对应关系见表1-2。
8421码是BCD的一种,因组成它的4位二进制数每一位的权为8、4、2、1而得名。这种编码形式利用4位二进制码来表示一个十进制的数码,使二进制和十进制之间的转换得以便捷地进行。
表1-2 十进制数与对应的BCD码
(2)ASCII码
目前采用的字符编码主要是ASCII码,即American Standard Code for Information Interchange的缩写。
ASCII码是用7位二进制数编码来表示128个字符和符号,一个ASCII码存放在一个字节的低7位,字节的高位为0,因此可以表示128个不同字符,如附录B所见。
数字0~9的ASCII码为0110000B~0111001B(即30H~39H),大写字母A~Z的ASCII码为41H~5AH。同一个字母的ASCII码的码制小写字母比大写字母大32(20H)。