1.3.3 计算机中数值的表示
通过前面的学习已经知道,计算机内部采用二进制表示数据。对于数值型数据,数据有正负和小数之分,因此必须解决有符号数、小数在计算机内部的表示。
1.有符号数与无符号数
由于计算机中只能存储0和1,所以数的符号也必须用0和1来表示。
现在假设一个数据用8位二进制表示,在表示无符号数据时,8位都用于表示数据,因此可表示的数据范围是0~255(00000000~11111111)。
当表示有符号数时,需要占用一个二进制位来表示符号。约定二进制数的最高位(左边第一位)作为符号位,用“0”表示正数,“1”表示负数,这样,数的正负号就被数值化了。假设一个数据用8位二进制表示,此时可表示的数据范围是-128~127(10000000~01111111)。
例如:
表示数据+84。再如:
表示数据-84。
2.真值与机器数
在计算机中,数据可以分为无符号数和有符号数两种,其符号和数字都用二进制表示,两者一起构成数的机内表示形式,称为机器数,而它真正表示的带有符号的数称为这个机器数的真值。例如,假设一个数据用8位二进制表示,则对于十进制数+115,由于其对应的二进制数是1111101,因此+105对应的机器数为01111101,而十进制数-115对应的机器数为11111101。
机器数有如下两个特点:
①机器数的位数固定,能表示的数值范围受到位数限制。例如,字长为8位的计算机,能表示的无符号数的范围是0~255,有符号数的范围是-128~127。由于机器数受字长的限制,因此当计算机运算结果超过机器数所能表示的范围时,就会产生“溢出”。
②用“0”表示正数,“1”表示负数,因此,机器数是连同数据符号一起数字化了的数据。
3.小数
在计算机中小数的表示有两种形式:定点表示法和浮点表示法,其中定点表示法如图1-6所示。
定点表示法是将小数点的位置固定在一个二进制数的某一位置。通常是将其固定在数的最前面,将数据表示为一个纯小数;或固定在数的最后面,将数据表示为一个纯整数。但在存储器中并不存储小数点,只是隐含规定它就在此位置。
图1-6 定点表示法
例如,将小数点固定在最前面:表示数据+0.6875。
上述的定点小数表示法简单直观,只能表示纯小数或纯整数,数值表示的范围太小,运算时容易产生溢出。而且实际使用的数大部分是混小数,即小数点前面和后面都有数据,因此用浮点数来表示这样的小数。
4.定点数和浮点数
数据表示方法有定点数和浮点数两种。通常,使用定点数表示整数,而用浮点数表示实数。
(1)整数
认为整数没有小数部分,小数点固定在数的最右边。整数可以分为无符号整数和有符号整数两类。无符号整数的所有二进制位全部用来表示数值的大小;有符号整数用最高位表示数的正负号,而其他位表示数值的大小。例如,假设数据用8位二进制表示,则十进制整数-59的计算机内部表示形式是10111011。
(2)浮点数
浮点数是小数点可以变动的数。由于机器字长有限,所表示的数值的范围也有限,为增大数值表示范围,防止溢出,通常采用浮点数表示法。浮点数的表示类似于十进制中的科学计数法。
浮点数由两部分组成,即尾数和阶码。如689.45可以写成0.68945×103,而且可以通过改变指数,使小数点的位置发生移动,如写成68945×10-2。十进制中的科学计数法的一般形式为:N=D×10n,其中D为纯小数,n为整数。在二进制中,一个数也可以写成这种形式:P=S×2E,其中S称为尾数,E称为阶码。
①阶码:用于表示小数点在该数中的位置,它是一个带符号的整数。
②尾数:用于表示数的有效数值,可以采用整数或纯小数两种形式。
一般PC选择32位(单精度)或64位(双精度)二进制表示一个浮点数。32位浮点数格式如下:
例如,一个十进制数-34500,在机器中,它的二进制数为-1000011011000100,如果使用浮点数表示,则为
5.原码、反码和补码
计算机中数的符号被数值化后,为了便于对机器数进行算术运算,提高运算速度,又设计了符号数的各种编码方案,主要有原码、反码和补码3种。
(1)原码原码是一种计算机中对数字的二进制定点表示方法。原码表示法在数值前面增加了一位符号位(即最高位为符号位),该位为0表示正数,该位为1表示负数,其余位表示数值的大小。假设计算机中用8位二进制表示一个数据,最高位被设置为符号位,后面的7位表示真值。数X的原码记为[X]原。0的原码有两种表示形式:
[+0]原=00000000
[-0]原=10000000
例如,求十进制数+75和-75的原码。
因为 (75)10=(1001011)2
所以 [+75]原=01001011
[-75]原=11001011
原码表示的数的范围与二进制数的位数(即机器字长)有关。如果用8位二进制数表示时,最高位为符号位,整数原码表示的范围为-128~+127,即最大数是01111111,最小数是11111111。同理,用16位二进制数表示整数原码的范围是-32768~+32767。
原码的优点是简单、直观,用原码进行乘法运算比较方便:尾数相乘,符号位单独运算(不考虑符号位产生的进位,只要将两个参加运算的数做简单的加法就得到它们乘积的符号)。显然,如果用原码进行加法运算就会遇到符号运算需要进行多次判断的麻烦:先要判断符号位是否同号,决定是进行加法或减法;对不同号的情况,还要判断哪个数的尾数大,才能决定最后运算结果的符号。为了简化原码加减法运算的复杂性,计算机中引入了反码和补码。
(2)反码
一个正数的反码等于它的原码;一个负数的反码,最高位(符号位)为1,其余各位按位求反。数X的反码记为[X]反。
例如,假设用8位二进制表示一个数据,则+1001101的反码为11001101,-1001101的反码为10110010。
零的反码有两种表示,即
[+0]反=00000000
[-0]反=11111111
一个数如果不考虑它的符号,按照取“反”的原则求它的反码,并与这个数的原数相加,其结果为所有位都是1。例如,1001101的反码为0110010,将它们相加:
1001101+0110010=1111111
这是反码的一个重要特性,称为“互补”。通常反码作为求补码过程的中间形式。
(3)补码
一个正数的补码等于它的原码;一个负数的补码,最高位(符号位)为1,其余各位按位求反,最末位加1,即“求反加1”。数X的补码记为[X]补。
例如,+1001101的补码为01001101;-1001101的反码为10110011,它的补码为反码加1,即10110011+1=10110100。
零的补码表示是唯一的,即
[+0]补=00000000
[-0]补=00000000
补码表示的数的范围也与二进制数的位数(即机器字长)有关。如果用8位二进制数表示时,最高位为符号位,整数补码表示的范围为-128~+127。用16位二进制数表示整数补码的范围是-32768~+32767。
又如,假设用8位二进制表示一个数据,求十进制数+75和-75的补码。
因为 (75)10=(1001011)2
所以 [+75]补=01001011
[-75]补=10110101
6.数据存储单位
(1)位
“位”(bit)是电子计算机中最小的数据单位。每一位的状态只能是0或1。
(2)字节
8个二进制位构成1个“字节”(Byte,单位符号为B),它是存储空间的基本计量单位。1B可以存储1个英文字母或者半个汉字,换句话说,1个汉字占据2B的存储空间。
(3)字(Word)
“字”由若干个字节构成,字的位数称为字长,不同档次的计算机有不同的字长。例如,一台8位机,它的1个字就等于1B,字长为8位。如果是一台16位机,那么,它的1个字就由2B构成,字长为16位。字是计算机进行数据处理和运算的单位,是衡量计算机性能的一个重要指标,字长越长,性能越强。
(4)KB(千字节)
在一般的计量单位中,小写k表示1000。例如,1千米=1000米,即1km;1千克=1000克,即1kg。同样,大写K在二进制中也有类似的含义,只是这时K表示210=1024,即1KB表示1024B。
(5)MB(兆字节)
计量单位中的M(兆)是106,见到M自然想起要在该数值的后边续上6个0,即扩大100万倍。在二进制中,MB也表示百万级的数量级,但1MB不是正好等于1000000B,而是1048576B即1MB=220B=1048576B。
计算机系统在数据存储容量计算中,有如下数据计量单位:
1B=8bit
1KB=210B=1024B
1MB=220B=1048576B
1GB=230B=1073741824B
1TB=240B=1099511627776B